[agc006e]Rotate 3x3

43 篇文章 0 订阅
7 篇文章 0 订阅

前言

结论题。

题目大意

不想讲。

做法

不想说。
推荐在网上搜索其他题解或看官方题解。

#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");
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值