| 比赛 |
期末考试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;
}