zoukankan      html  css  js  c++  java
  • 洛谷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;
    } 
  • 相关阅读:
    Angular 学习笔记 (Material table sticky 原理)
    Asp.net core 学习笔记 ( ef core transaction scope & change level )
    sql server 学习笔记 (nested transaction 嵌套事务)
    html 图片文字并排显示
    Maven 的配置
    Eclipse的配置
    tomcat 的安装与配置
    java jdk的安装与配置
    javascript 拖拽
    html5 CSS input placeholder兼容性处理
  • 原文地址:https://www.cnblogs.com/Hoyoak/p/11832759.html
Copyright © 2011-2022 走看看