题目:判断一个有序序列能否通过两轮相同的交换操作得到给出的序列
结论:偶数、等数量、的连通块的数目均为偶数时可以。
#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");
}
}