首页 > 其他 > 详细

洛谷P2585 [ZJOI2006]三色二叉树

时间:2019-11-11 09:48:17      阅读:70      评论:0      收藏:0      [点我收藏+]

感觉方程推错了,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;
} 

 

洛谷P2585 [ZJOI2006]三色二叉树

原文:https://www.cnblogs.com/Hoyoak/p/11832759.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!