• 洛谷P2585 [ZJOI2006]三色二叉树


    感觉方程推错了,But居然过了QwQ

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #define maxn 500010
    
    using namespace std;
    
    struct node
    {
        int lc,rc;
        int son;
    };
    node tree[maxn<<1];
    char s[maxn];
    int n,dp[maxn][2];
    int f[maxn][2];
    int siz_2[maxn],cnt;
    bool vis[maxn];
    
    inline void dfs(int now)
    {
        if(now==-1) return;
        dfs(tree[now].lc);
        dfs(tree[now].rc);
        if(tree[now].son==2)
        {
            dp[now][0]=max(dp[tree[now].lc][1]+dp[tree[now].rc][0],dp[tree[now].lc][0]+dp[tree[now].rc][1]);
            //dp[now][0]=max(dp[tree[now].lc][0]+dp[tree[now].rc][0],dp[now][0]);
            dp[now][1]=dp[tree[now].lc][0]+dp[tree[now].rc][0];
            dp[now][1]+=1;
            f[now][0]=min(f[tree[now].lc][1]+f[tree[now].rc][0],f[tree[now].lc][0]+f[tree[now].rc][1]);
            //f[now][0]=min(f[tree[now].lc][0]+f[tree[now].rc][0],f[now][0]);
            f[now][1]=f[tree[now].lc][0]+f[tree[now].rc][0];
            f[now][1]+=1;
            if(f[now][0]==0) f[now][0]=1;
        }
        else if(tree[now].son==1)
        {
            dp[now][0]=max(dp[tree[now].lc][1],dp[tree[now].lc][0]);
            dp[now][1]=dp[tree[now].lc][0]+1;
            f[now][1]=f[tree[now].lc][0]+1;
            f[now][0]=min(f[tree[now].lc][1],f[tree[now].lc][0]);
        }
        else
        {
            dp[now][0]=0; dp[now][1]=1;
            f[now][0]=0; f[now][1]=1;
        }
        return;
    }
    
    inline void build()
    {
        for(register int i=1;i<=n;++i)
        {
            if(s[i]-'0'==0)
            {
                tree[i].lc=-1;
                tree[i].rc=-1;
                tree[i].son=0;
            }
            else if(s[i]-'0'==1)
            {
                tree[i].lc=i+1;
                vis[i+1]=true;
                tree[i].rc=-1;
                tree[i].son=1;
            }
            else 
            {
                tree[i].son=2;
                tree[i].lc=i+1;
                vis[i+1]=true;
                if(!vis[i]) tree[siz_2[cnt--]].rc=i,vis[i]=true;
                siz_2[++cnt]=i;
            }
            if(!vis[i]) tree[siz_2[cnt--]].rc=i,vis[i]=true;
        }
        return;
    } 
    
    int main()
    {
        scanf("%s",s+1);
        n=strlen(s+1);
        build();
        dfs(1);
        printf("%d %d",max(dp[1][1],dp[1][0]),min(f[1][1],f[1][0]));
        return 0;
    } 
  • 相关阅读:
    2019春季学期进度报告(五)
    《构建之法》读后感三
    5.4号个人冲刺(三)
    大二下学期学习进度(九)
    5.3号个人冲刺(二)
    5.2号个人冲刺(一)
    《代码大全2》阅读笔记01
    大二下学期学习进度(八)
    用户模板和用户场景
    个人作业4-用户通过单步执行的方式看到你的算法是如何工作的(之前数组)
  • 原文地址:https://www.cnblogs.com/Hoyoak/p/11832759.html
Copyright © 2020-2023  润新知