【bzoj1864】 ZJOI2006 三色二叉树 水题

来源:互联网 发布:c语言用函数判断素数 编辑:程序博客网 时间:2024/05/17 02:18

当年ZJOI这么水呀,随便水一下,结果跪了半个小时。。。

#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<iostream>#include<algorithm>#define maxn 500010using namespace std;char s[maxn];int f[maxn][3],g[maxn][3];int n,m,num,id;void dfs(){id++;if (s[id]=='0'){f[id][0]=1;f[id][1]=f[id][2]=0;g[id][0]=1;g[id][1]=g[id][2]=0;}if (s[id]=='1'){int x=id;dfs();f[x][0]=max(f[x+1][1],f[x+1][2])+1;f[x][1]=max(f[x+1][0],f[x+1][2]);f[x][2]=max(f[x+1][0],f[x+1][1]);g[x][0]=min(g[x+1][1],g[x+1][2])+1;g[x][1]=min(g[x+1][0],g[x+1][2]);g[x][2]=min(g[x+1][0],g[x+1][1]);}if (s[id]=='2'){int x=id,l,r;l=id+1;dfs();r=id+1;dfs();f[x][0]=max(f[l][1]+f[r][2],f[l][2]+f[r][1])+1;f[x][1]=max(f[l][0]+f[r][2],f[l][2]+f[r][0]);f[x][2]=max(f[l][0]+f[r][1],f[l][1]+f[r][0]);g[x][0]=min(g[l][1]+g[r][2],g[l][2]+g[r][1])+1;g[x][1]=min(g[l][0]+g[r][2],g[l][2]+g[r][0]);g[x][2]=min(g[l][0]+g[r][1],g[l][1]+g[r][0]);}}int main(){scanf("%s",s+1);dfs();printf("%d %d\n",max(f[1][0],max(f[1][1],f[1][2])),min(g[1][0],min(g[1][1],g[1][2])));return 0;}


0 0
原创粉丝点击