Amazing Trick (构造题,shuffle随机化,2个队列转化位置问题)
思路:
- 通过题目就可以转化题意为:
- 让 pi!=i &&pi !=ai
- 发现合理的队列很多,就通过随机数去产一个队列出来
- shuffle:
-
random_device gen; mt19937 rd(gen());
-
shuffle(p+1,p+1+n,rd);
#include<bits/stdc++.h> using namespace std; const int N=100010; random_device gen; mt19937 rd(gen()); int T,n,a[N],p[N],pos[N],POS[N],q[N]; bool check(){ for(int i=1;i<=n;++i){ int po=pos[i]; q[i]=POS[po]; if(p[i]==i||q[i]==i)return 0; } puts("Possible"); for(int i=1;i<=n;++i)printf("%d ",p[i]); puts(""); for(int i=1;i<=n;++i)printf("%d ",q[i]); puts(""); return 1; } void solve(){ scanf("%d",&n); for(int i=1;i<=n;++i)scanf("%d",a+i),pos[a[i]]=i; for(int i=1;i<=n;++i)p[i]=i,POS[p[i]]=i; if(check())return; for(int i=1;i<=1000;++i){ shuffle(p+1,p+1+n,rd); for(int i=1;i<=n;++i)POS[p[i]]=i; if(check())return; } puts("Impossible"); } int main(){ scanf("%d",&T); while(T--)solve(); return 0; }