# BZOJ1864: [Zjoi2006]三色二叉树

BZOJ1864: [Zjoi2006]三色二叉树

1122002010

5 2

## 题解Here!

• $num[i]==0$：

• $num[i]==1$：

$$dp[i][0]=\max\left\{\begin{array}{}dp[j][1]+1\\dp[j][2]+1\end{array}\right.j\in son_i$$

$$dp[i][1/2]=\max\left\{\begin{array}{}dp[j][0]\\dp[j][2/1]\end{array}\right.j\in son_i$$

• $num[i]==2$：

$$dp[i][0]=\max\left\{\begin{array}{}\max\left\{\begin{array}{}dp[j_1][1]+1\\dp[j_2][2]+1\end{array}\right.\\\\\max\left\{\begin{array}{}dp[j_1][2]+1\\dp[j_2][1]+1\end{array}\right.\end{array}\right.$$

$$dp[i][1/2]=\max\left\{\begin{array}{}\max\left\{\begin{array}{}dp[j_1][0]\\dp[j_2][2/1]\end{array}\right.\\\\\max\left\{\begin{array}{}dp[j_1][2/1]\\dp[j_2][0]\end{array}\right.\end{array}\right.$$

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define MAXN 500010
using namespace std;
int n=1,c=1,pos=1;
struct Tree{
int next,to;
}a[MAXN<<1];
char str[MAXN];
int date=0,w=1;char c=0;
while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
return date*w;
}
}
void dfs(int rt){
num[rt]=str[pos]-'0';
for(int i=1;i<=num[rt];i++){
n++;
pos++;
dfs(n);
}
}
void dp(int rt){
if(num[rt]==0){
f[rt][0]=g[rt][0]=1;
f[rt][1]=f[rt][2]=g[rt][1]=g[rt][2]=0;
}
else if(num[rt]==1){
int will;
will=a[i].to;
dp(will);
f[rt][0]=max(f[rt][0],max(f[will][1],f[will][2])+1);
f[rt][1]=max(f[rt][1],max(f[will][0],f[will][2]));
f[rt][2]=max(f[rt][2],max(f[will][0],f[will][1]));
g[rt][0]=min(g[rt][0],min(g[will][1],g[will][2])+1);
g[rt][1]=min(g[rt][1],min(g[will][0],g[will][2]));
g[rt][2]=min(g[rt][2],min(g[will][0],g[will][1]));
}
}
else{
int will,son[2];
will=a[i].to;
son[j]=will;
dp(will);
}
f[rt][0]=max(f[rt][0],max(f[son[0]][1]+f[son[1]][2],f[son[0]][2]+f[son[1]][1])+1);
f[rt][1]=max(f[rt][1],max(f[son[0]][0]+f[son[1]][2],f[son[0]][2]+f[son[1]][0]));
f[rt][2]=max(f[rt][2],max(f[son[0]][0]+f[son[1]][1],f[son[0]][1]+f[son[1]][0]));
g[rt][0]=min(g[rt][0],min(g[son[0]][1]+g[son[1]][2],g[son[0]][2]+g[son[1]][1])+1);
g[rt][1]=min(g[rt][1],min(g[son[0]][0]+g[son[1]][2],g[son[0]][2]+g[son[1]][0]));
g[rt][2]=min(g[rt][2],min(g[son[0]][0]+g[son[1]][1],g[son[0]][1]+g[son[1]][0]));
}
}
void work(){
scanf("%s",str+1);
dfs(1);
memset(f,0,sizeof(f));
memset(g,127,sizeof(g));
dp(1);
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])));
}
int main(){
work();
return 0;
}


posted @ 2018-11-09 21:59  符拉迪沃斯托克  阅读(209)  评论(0编辑  收藏  举报
Live2D