前言
结论题。
题目大意
不想讲。
做法
不想说。
推荐在网上搜索其他题解或看官方题解。
#include<cstdio>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxn=100000+10;
int tree[maxn],a[maxn][3],s[maxn],w[maxn];
int b[3];
int inv[2],flip[2];
int i,j,k,l,t,n,m,now;
bool czy;
int lowbit(int x){
return x&-x;
}
void change(int x,int v){
while (x>0){
tree[x]+=v;
x-=lowbit(x);
}
}
int query(int x){
int t=0;
while (x<=n){
t+=tree[x];
x+=lowbit(x);
}
return t;
}
int main(){
scanf("%d",&n);
fo(j,0,2)
fo(i,1,n) scanf("%d",&a[i][j]);
fo(i,1,n){
fo(j,0,2) b[j]=a[i][j];
sort(b,b+3);
if (b[1]!=b[0]+1||b[2]!=b[1]+1||b[2]%3!=0||a[i][1]!=b[1]){
printf("No\n");
return 0;
}
if (a[i][0]>a[i][2]) inv[i%2]^=1;
s[i]=b[2]/3;
if ((i-s[i])%2){
printf("No\n");
return 0;
}
}
fo(i,1,n) w[s[i]]=i;
for(i=1;i<=n;i+=2){
now=w[i]+2*query(w[i]);
flip[1]=(flip[1]+abs(i-now)/2)%2;
change(w[i],1);
}
fo(i,0,n) tree[i]=0;
for(i=2;i<=n;i+=2){
now=w[i]+2*query(w[i]);
flip[0]=(flip[0]+abs(i-now)/2)%2;
change(w[i],1);
}
czy=1;
if (inv[0]!=flip[1]||inv[1]!=flip[0]) czy=0;
if (czy) printf("Yes\n");else printf("No\n");
}