数组开大MLE,开小RE。
(似乎?)里面没有<0的变量
RE代码:(MLE只有数组大小不同)
#include <cstdio>
#include <cstring>
#include <string>
#define int long long
//#define max(a,b) (a>b)?a:b
//#define min(a,b) (a<b)?a:b
using namespace std;
struct node{
int l,r,cnt;
}g[3200007];
int n;
int a[3200007],f[2][3200007][3];
int ptr=1;
void build(){
int fa=ptr;
ptr++;
if(a[fa]>=1){
int l=ptr;
g[fa].l=l;
build();
}
if(a[fa]>=2){
int r=ptr;
g[fa].r=r;
build();
}
g[fa].cnt=a[fa];
int u=fa;
if(g[u].cnt==0){
f[0][u][0]=f[1][u][0]=1;
f[0][u][1]=f[1][u][1]=0;
f[0][u][2]=f[1][u][2]=0;
return ;
}
if(g[u].cnt==1){
f[0][u][0]=max(f[0][g[u].l][1],f[0][g[u].l][2])+1;
f[0][u][1]=max(f[0][g[u].l][0],f[0][g[u].l][2]);
f[0][u][2]=max(f[0][g[u].l][0],f[0][g[u].l][1]);
f[1][u][0]=min(f[1][g[u].l][1],f[1][g[u].l][2])+1;
f[1][u][1]=min(f[1][g[u].l][0],f[1][g[u].l][2]);
f[1][u][2]=min(f[1][g[u].l][0],f[1][g[u].l][1]);
return ;
}
if(g[u].cnt==2){
f[0][u][0]=max(f[0][g[u].l][1]+f[0][g[u].r][2],f[0][g[u].r][1]+f[0][g[u].l][2])+1;
f[0][u][1]=max(f[0][g[u].l][0]+f[0][g[u].r][2],f[0][g[u].r][0]+f[0][g[u].l][2]);
f[0][u][2]=max(f[0][g[u].l][0]+f[0][g[u].r][1],f[0][g[u].r][0]+f[0][g[u].l][1]);
f[1][u][0]=min(f[1][g[u].l][1]+f[1][g[u].r][2],f[1][g[u].r][1]+f[1][g[u].l][2])+1;
f[1][u][1]=min(f[1][g[u].l][0]+f[1][g[u].r][2],f[1][g[u].r][0]+f[1][g[u].l][2]);
f[1][u][2]=min(f[1][g[u].l][0]+f[1][g[u].r][1],f[1][g[u].r][0]+f[1][g[u].l][1]);
return ;
}
return ;
}
void dfs(int u){
if(g[u].cnt==0){
f[0][u][0]=f[1][u][0]=1;
f[0][u][1]=f[1][u][1]=0;
f[0][u][2]=f[1][u][2]=0;
return ;
}
if(g[u].cnt==1){
dfs(g[u].l);
f[0][u][0]=max(f[0][g[u].l][1],f[0][g[u].l][2])+1;
f[0][u][1]=max(f[0][g[u].l][0],f[0][g[u].l][2]);
f[0][u][2]=max(f[0][g[u].l][0],f[0][g[u].l][1]);
f[1][u][0]=min(f[1][g[u].l][1],f[1][g[u].l][2])+1;
f[1][u][1]=min(f[1][g[u].l][0],f[1][g[u].l][2]);
f[1][u][2]=min(f[1][g[u].l][0],f[1][g[u].l][1]);
return ;
}
if(g[u].cnt==2){
dfs(g[u].l);
dfs(g[u].r);
f[0][u][0]=max(f[0][g[u].l][1]+f[0][g[u].r][2],f[0][g[u].r][1]+f[0][g[u].l][2])+1;
f[0][u][1]=max(f[0][g[u].l][0]+f[0][g[u].r][2],f[0][g[u].r][0]+f[0][g[u].l][2]);
f[0][u][2]=max(f[0][g[u].l][0]+f[0][g[u].r][1],f[0][g[u].r][0]+f[0][g[u].l][1]);
f[1][u][0]=min(f[1][g[u].l][1]+f[1][g[u].r][2],f[1][g[u].r][1]+f[1][g[u].l][2])+1;
f[1][u][1]=min(f[1][g[u].l][0]+f[1][g[u].r][2],f[1][g[u].r][0]+f[1][g[u].l][2]);
f[1][u][2]=min(f[1][g[u].l][0]+f[1][g[u].r][1],f[1][g[u].r][0]+f[1][g[u].l][1]);
return ;
}
}
char ch;
signed main(){
ch=getchar();
while(ch!='\n'&&ch!='\r'){
a[++n]=(int)(ch-'0');
ch=getchar();
}
//printf("START BUILDING...\n");
build();
//for(int i=1;i<=n;i++){
//printf("%d %d %d %d\n",g[i].cnt,g[i].fa,g[i].l,g[i].r);
//}
//printf("START \"DFS\"ING...\n");
//dfs(1);
int ans1=max(max(f[0][1][0],f[0][1][1]),f[0][1][2]);
int ans2=min(min(f[1][1][0],f[1][1][1]),f[1][1][2]);
printf("%d %d\n",ans1,ans2);
return 0;
}