1 条题解

  • 2
    @ 2024-7-29 19:46:49

    输入要求中有一句重点:保证输入的询问序列 qq 单调递增。我们可以转变思路,从“让 qiq_i 来找第 qiq_i 趟”变成“让第 qiq_i 趟去找qiq_i”。说白了,跑 nn 趟,如果在第 tt 趟时,t=qit=q_i 了,那就把此时跑的结果亮出来,由于 qiq_i 单调递增,所以顺序一定不会出错。

    在具体实现上,我们给每一个数标号,每次交换时,我们同步把标号也变化了,就能做到每次选择交换复杂度 O(1)

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,a[100005],q[15],biao[100005],cnt=1;
    int main(){
       cin>>n>>m;
       for(int i=1;i<=n;i++) cin>>a[i];
       for(int i=1;i<=m;i++) cin>>q[i];
       for(int i=1;i<=n;i++) biao[a[i]]=i;
       for(int i=1;i<=n;i++){
          biao[a[i]]=biao[i];
          swap(a[biao[i]],a[i]);
          biao[i]=i;
          if(i==q[cnt]){
             cnt++;
             for(int j=1;j<=n;j++) cout<<a[j]<<" ";
             cout<<endl;
          }
       }
       return 0;
    }
    

    信息

    ID
    764
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    66
    已通过
    22
    上传者