【结论】判断一个有序序列能否通过两轮相同的交换操作得到给出的序列

来源:互联网 发布:java web不用tomcat 编辑:程序博客网 时间:2024/06/16 01:44

题目:判断一个有序序列能否通过两轮相同的交换操作得到给出的序列

结论:偶数、等数量、的连通块的数目均为偶数时可以。

#include<cstdio>#include<iostream>using namespace std;const int need=1003;//.........................................inline void in_(int &d){    char t=getchar();    while(t<'0'||t>'9') t=getchar();    for(d=0;!(t<'0'||t>'9');t=getchar()) d=(d<<1)+(d<<3)+t-'0';}//.........................................int be[need];int cnt_dian[need],cnt_huan[need];int gb(int x){    return be[x]==x? x: be[x]=gb(be[x]);} //.........................................int main(){    int T,n;in_(T);while(T--){    in_(n);    for(int i=1;i<=n;i++) be[i]=i,cnt_dian[i]=cnt_huan[i]=0;    for(int i=1,a,x,y;i<=n;i++)    {        in_(a);        x=gb(a),y=gb(i);        if(x!=y) be[x]=y;    }    int numhuan=0;    for(int i=1,tmp;i<=n;i++)    {        tmp=gb(i);        numhuan=max(numhuan,tmp);        cnt_dian[tmp]++;    }    for(int i=1;i<=numhuan;i++)    {        if((cnt_dian[i]&1)==0) cnt_huan[cnt_dian[i]]++;    }    bool gans=true;    for(int i=1;i<=n;i++)    {        if((cnt_huan[i]&1)==1)         {            puts("Impossible");            gans=false;            break;        }    }    if(gans) puts("Maybe");} }
0 0