T1 签到题
大意:构造一个排列,使
可以用双指针哪边不同放那边,最后相等时和前面交换
也可以直接按顺序放,冲突时想办法和前面交换
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int T,n,a[N],ans[N];
signed main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int l=1,r=n,flag=true;
for(int i=1;i<=n;i++){
if(l!=a[i]){
ans[i]=l;
l++;
}else if(r!=a[i]){
ans[i]=r;
r--;
}else{
int f=false;
for(int j=1;j<i;j++){
if(a[j]!=l&&ans[j]!=a[i]){
ans[i]=ans[j];
ans[j]=l;
l++;
f=true;
break;
}else if(a[j]!=r&&ans[j]!=a[i]){
ans[i]=ans[j];
ans[j]=r;
r--;
f=true;
break;
}
}
if(!f){
flag=false;
}
}
}
if(flag){
printf("YES\n");
for(int i=1;i<=n;i++){
printf("%d ",ans[i]);
}
printf("\n");
}else{
printf("NO\n");
}
}
return 0;
}
T2 翻转
zzh 有一个矩形,这个矩形被划分成了个区域,每个区域中都写了或。
zzh 可以对这个矩形进行翻转操作,翻转操作定义如下:
选择一条只经过区域边界,从矩形左上角到矩形右下角的最短路,然后将这条路径下方的所有区域中的数翻转(