题解:CF2031B Penchick and Satay Sticks

AK_400

2024-11-17 15:49:39

Solution

首先 1 只能和 2 换,所以要么 p_1=1,要么 p_1=2,p_2=1,否则无解。然后 1 归位后 2 只能和 3 换,和 1 同理。于是枚举索引 i,如果 p_i=i,那么继续枚举,否则如果 p_i=i+1\land p_{i+1}=i,交换 p_ip_{i+1},继续枚举,否则无解。

#include<bits/stdc++.h>
using namespace std;
int n,p[200005];
void slv(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>p[i];
    for(int i=1;i<=n;i++){
        if(p[i]==i)continue;
        if(p[i+1]==i&&abs(p[i]-p[i+1])==1)swap(p[i],p[i+1]);
        else {
            cout<<"NO"<<endl;
            return;
        }
    }
    cout<<"YES"<<endl;
}
int main(){
    int T;cin>>T;while(T--)
    slv();
    return 0;
}