zoukankan      html  css  js  c++  java
  • BZOJ 1864: [Zjoi2006]三色二叉树 树形DP + 读入

    Description

    Input

    仅有一行,不超过500000个字符,表示一个二叉树序列。

    Output

    输出文件也只有一行,包含两个数,依次表示最多和最少有多少个点能够被染成绿色。

    题解:本题大水题,主要卡读入. 能把树建出来就普及组水题了~

    #include <bits/stdc++.h>
    #define setIO(s) freopen(s".in","r",stdin) 
    #define maxn 1000000 
    #define lson ch[u][0] 
    #define rson ch[u][1] 
    using namespace std;
    int ch[maxn][2], f[maxn], g[maxn]; 
    int n = 1; 
    void read(int u)
    {
        char c = getchar(); 
        if(c == '0') return; 
        ++n, lson = n, read(lson); 
        if(c == '2') ++n, rson = n, read(rson);       
    }
    void dfs1(int u)
    {
        if(!u) return;  
        dfs1(lson), dfs1(rson); 
        f[u] = g[lson] + g[rson] + 1; 
        g[u] = max(f[lson] + g[rson], g[lson] + f[rson]);      
    }
    void dfs2(int u)
    {
        if(!u) return; 
        dfs2(lson), dfs2(rson); 
        f[u] = g[u] = 0; 
        f[u] = g[lson] + g[rson] + 1; 
        g[u] = min(f[lson] + g[rson], g[lson] + f[rson]);    
    }
    int main()
    {
        // setIO("input");
        read(1); 
        dfs1(1); 
        printf("%d ",max(g[1], f[1]));
        dfs2(1); 
        printf("%d
    ",min(g[1], f[1]));  
        return 0; 
    }
    

      

  • 相关阅读:
    怎样改动、扩展并重写Magento代码
    解决Gradle minifyEnabled无法找到错误
    使用Hadoop的MapReduce与HDFS处理数据
    cmake 学习笔记(一)
    简单的日志系统
    WebStorm 7.0 注冊码
    DOS命令大全--具体解释
    SQL SERVER之数据查询
    闰年的定义
    Javascript作用域链
  • 原文地址:https://www.cnblogs.com/guangheli/p/10982705.html
Copyright © 2011-2022 走看看