比赛 期末考试4 评测结果 AAAAAAAAAAWWWWWWWWWWWWWWW
题目名称 区间消除 最终得分 40
用户昵称 RpUtl 运行时间 0.220 s
代码语言 C++ 内存使用 3.85 MiB
提交时间 2026-02-12 10:00:13
显示代码纯文本
#include <iostream>
#include <cstdio>
using namespace std;
const int N=3005;
int dp[N][N],n,a[N],s[N],p[N];
void PlanA(){
	for(int i=1;i<=n;i++){
		scanf("%d",a+i);
		s[i]=s[i-1]^a[i];
	}
	dp[1][n]=1;
	for(int l=n;l>=2;l--){
		for(int i=1;i+l-1<=n;i++){
			int j=i+l-1;
			if(!dp[i][j])continue;
			for(int k=i;k<j;k++){
				if((s[k]^s[i-1])>(s[j]^s[k])){
					dp[i][k]=1;
				}else if((s[k]^s[i-1])<(s[j]^s[k])){
					dp[k+1][j]=1;
				}else{
					dp[i][k]=dp[k+1][j]=1;
				}
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(dp[i][i])printf("1");
		else printf("0");
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			dp[i][j]=0;
		} 
		s[i]=0;
	}
	printf("\n");
	return;
} 
void PlanB(){
	for(int i=1;i<=n;i++)scanf("%d",a+i);
	for(int i=1;i<=n;i++)s[i]=s[i-1]+(a[i]==1);
	for(int i=n;i>=1;i--)p[i]=p[i+1]+(a[i]==1);
	for(int i=1;i<=n;i++){
		if(a[i]==0){
			if((s[i-1]&1)||(p[i+1]&1)){
				printf("0");
			}else{
				printf("1");
			}
		}else{
			if((s[i-1]&1)&&(p[i+1]&1)){
				printf("0");
			}else{
				printf("1");
			}
		}
	}
	for(int i=1;i<=n;i++)s[i]=p[i]=0;
	return;
}
int main(){
	freopen("dump.in","r",stdin);
	freopen("dump.out","w",stdout); 
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		if(n<=300)PlanA();
		else PlanB();
	}
	return 0;
}