zoukankan      html  css  js  c++  java
  • [ZJOI2006]三色二叉树

    [ZJOI2006]三色二叉树

    BZOJ
    luogu
    分3种颜色讨论转移一下

    #include<bits/stdc++.h>
    using namespace std;
    const int _=500005;
    int n,now;
    int ls[_],rs[_],r[_],g[_],b[_];
    char s[_];
    void bu(int u){
        if(s[u]=='1'||s[u]=='2'){++now;bu(ls[u]=now);}
        if(s[u]=='2'){++now;bu(rs[u]=now);}
    }
    void qmax(int u){
        if(s[u]=='0'){g[u]=1;r[u]=0;b[u]=0;return;}
        if(s[u]=='1'){
            int v=ls[u];qmax(v);
            g[u]=max(b[v],r[v])+1;
            r[u]=max(g[v],b[v]);
            b[u]=max(g[v],r[v]);
        }
        if(s[u]=='2'){
            qmax(ls[u]);qmax(rs[u]);
            g[u]=max(b[ls[u]]+r[rs[u]],r[ls[u]]+b[rs[u]])+1;
            b[u]=max(g[ls[u]]+r[rs[u]],r[ls[u]]+g[rs[u]]);
            r[u]=max(b[ls[u]]+g[rs[u]],g[ls[u]]+b[rs[u]]);
        }
    }
    void qmin(int u){
        if(s[u]=='0'){g[u]=1;r[u]=0;b[u]=0;return;}
        if(s[u]=='1'){
            int v=ls[u];qmin(v);
            g[u]=min(b[v],r[v])+1;
            r[u]=min(g[v],b[v]);
            b[u]=min(g[v],r[v]);
        }
        if(s[u]=='2'){
            qmin(ls[u]);qmin(rs[u]);
            g[u]=min(b[ls[u]]+r[rs[u]],r[ls[u]]+b[rs[u]])+1;
            b[u]=min(g[ls[u]]+r[rs[u]],r[ls[u]]+g[rs[u]]);
            r[u]=min(b[ls[u]]+g[rs[u]],g[ls[u]]+b[rs[u]]);
        }
    }
    int main(){
        scanf("%s",s+1);n=strlen(s+1);
        bu(now=1);
        qmax(1);
        printf("%d ",max(g[1],max(r[1],b[1])));
        memset(g,63,sizeof(g));
        memset(r,63,sizeof(r));
        memset(b,63,sizeof(b));
        qmin(1);
        printf("%d
    ",min(g[1],min(b[1],r[1])));
        return 0;
    }
    
  • 相关阅读:
    quick-cocos2dx 3.5集成protobuf
    lua和luajit在cocos2dx mac模拟器的简单测试
    cocos2dx-lua手游客户端框架设计
    cocos2dx动画技术选型
    lua中的面向对象
    html 学习
    OC 与js 互相调用
    Carthage的安装和使用
    Bomb后端云使用
    FMDB简单使用
  • 原文地址:https://www.cnblogs.com/sdzwyq/p/9923698.html
Copyright © 2011-2022 走看看