CF1682B 题解

· · 题解

update:修改逻辑问题。

直接送我 -83 的一道题。

首先不难看出所有不在原位置的所有数都要进行交换,还有 & 满足结合律,所以所有不在位置上的数 & 起来即可。

我们来证明一下一定有解,排列一定有一个 0,将它和所有不在位置的数交换,& 显然结果都为 0,就能证明出一定有解。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
const int N=2e5+10;
int n,a[N];
int main()
{
    int t=read();
    while(t--){
        n=read();
        vector<int>b;
        for(int i=0;i<n;i++){
            a[i]=read();
            if(a[i]!=i)
                b.push_back(i);
        }
        //cout<<b.size()<<' ';
        int ans=b[0];
        for(int i=1;i<b.size();i++)
            ans&=b[i];
        cout<<ans<<endl;
    }
    return 0;
}