RE40/MLE40 求助
查看原帖
RE40/MLE40 求助
768195
ty_mxzhn楼主2023/3/8 17:45

数组开大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;
}
2023/3/8 17:45
加载中...