zoukankan      html  css  js  c++  java
  • BZOJ 1864: [Zjoi2006]三色二叉树( 树形dp )

    难得的ZJOI水题...DFS一遍就行了... 

    -----------------------------------------------------------------------

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cctype>
     
    using namespace std;
     
    const int maxn = 500009;
     
    int N = 0, Mx[maxn][3], Mn[maxn][3], L[maxn], R[maxn];
     
    void dfs(int x) {
    char c = getchar();
    if(c != '0') {
    dfs(L[x] = N++);
    if(c == '2') dfs(R[x] = N++);
    }
    }
     
    void DFS(int x) {
    if(~L[x]) DFS(L[x]);
    if(~R[x]) DFS(R[x]);
    if(~L[x] && ~R[x]) {
    Mx[x][0] = max(Mx[L[x]][1] + Mx[R[x]][2], Mx[L[x]][2] + Mx[R[x]][1]) + 1;
    Mx[x][1] = max(Mx[L[x]][0] + Mx[R[x]][2], Mx[L[x]][2] + Mx[R[x]][0]);
    Mx[x][2] = max(Mx[L[x]][0] + Mx[R[x]][1], Mx[L[x]][1] + Mx[R[x]][0]);
    Mn[x][0] = min(Mn[L[x]][1] + Mn[R[x]][2], Mn[L[x]][2] + Mn[R[x]][1]) + 1;
    Mn[x][1] = min(Mn[L[x]][0] + Mn[R[x]][2], Mn[L[x]][2] + Mn[R[x]][0]);
    Mn[x][2] = min(Mn[L[x]][0] + Mn[R[x]][1], Mn[L[x]][1] + Mn[R[x]][0]);
    } else if(~L[x]) {
    Mx[x][0] = max(Mx[L[x]][1], Mx[L[x]][2]) + 1;
    Mx[x][1] = max(Mx[L[x]][0], Mx[L[x]][2]);
    Mx[x][2] = max(Mx[L[x]][1], Mx[L[x]][0]);
    Mn[x][0] = min(Mn[L[x]][1], Mn[L[x]][2]) + 1;
    Mn[x][1] = min(Mn[L[x]][0], Mn[L[x]][2]);
    Mn[x][2] = min(Mn[L[x]][1], Mn[L[x]][0]);
    } else if(~R[x]) {
    Mx[x][0] = max(Mx[R[x]][1], Mx[R[x]][2]) + 1;
    Mx[x][1] = max(Mx[R[x]][0], Mx[R[x]][2]);
    Mx[x][2] = max(Mx[R[x]][1], Mx[R[x]][0]);
    Mn[x][0] = min(Mn[R[x]][1], Mn[R[x]][2]) + 1;
    Mn[x][1] = min(Mn[R[x]][0], Mn[R[x]][2]);
    Mn[x][2] = min(Mn[R[x]][1], Mn[R[x]][0]);
    } else {
    Mx[x][1] = Mx[x][2] = 0; Mx[x][0] = 1;
    Mn[x][1] = Mn[x][2] = 0; Mn[x][0] = 1;
    }
    }
     
    int main() {
    memset(L, -1, sizeof L);
    memset(R, -1, sizeof R);
    dfs(N++); DFS(0);
    printf("%d %d ", *max_element(Mx[0], Mx[0] + 3), *min_element(Mn[0], Mn[0] + 3));
    return 0;
    }

    -----------------------------------------------------------------------

    1864: [Zjoi2006]三色二叉树

    Time Limit: 1 Sec  Memory Limit: 64 MB
    Submit: 590  Solved: 412
    [Submit][Status][Discuss]

    Description

    Input

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

    Output

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

    Sample Input

    1122002010

    Sample Output

    5 2

    HINT

    Source

  • 相关阅读:
    java设计模式-适配器模式
    java设计模式-外观模式
    java设计模式-享元模式
    java设计模式-装饰模式
    java设计模式-组合模式
    java设计模式-桥接模式
    12月Java原生商城APP源码-完全开源
    uniapp插件市场-涂图视频编辑-美妆-剪辑-微整形原生sdk插件发布-优雅草科技
    12月最新仿知音漫画网站源码+手机端,小说漫画生成静态文件,超强负载量安全可靠
    如何把网易云音乐ncm格式转换成mp3格式---记一下
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4933037.html
Copyright © 2011-2022 走看看