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 @   VxiaohuanV  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示