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;
}
View Code

 

posted @ 2023-03-15 23:16  VxiaohuanV  阅读(19)  评论(0编辑  收藏  举报