結果

問題 No.3529 2p Teleportations
コンテスト
ユーザー tau1235
提出日時 2026-05-04 23:50:56
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 247 ms / 2,000 ms
コード長 1,825 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 3,903 ms
コンパイル使用メモリ 346,172 KB
実行使用メモリ 7,972 KB
最終ジャッジ日時 2026-05-04 23:51:22
合計ジャッジ時間 24,871 ms
ジャッジサーバーID
(参考情報)
judge3_1 / judge2_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 49
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include<bits/stdc++.h>
using namespace std;

void solve(){
  int n,p;
  cin>>n>>p;
  vector<int> a(n),tmp(n);
  for (int i=0;i<n;i++){
    cin>>a[i];
    a[i]--;
    tmp[a[i]]=i;
  }
  swap(a,tmp);
  vector<vector<vector<int>>> g(n+1);
  {
    vector<bool> vis(n);
    vector<int> vec;
    auto dfs=[&](auto dfs,int v)-> void {
      if (vis[v]){
        g[(int)vec.size()].push_back(vec);
        vec.clear();
        return;
      }
      vis[v]=true;
      vec.push_back(v);
      dfs(dfs,a[v]);
    };
    for (int i=0;i<n;i++) if (!vis[i]) dfs(dfs,i);
  }
  vector<int> ans(n,-1);
  {
    auto f=[&](vector<int> vec){
      int k=vec.size();
      if (k==1){
        ans[vec[0]]=vec[0];
        return -1;
      }
      int j=-1;
      for (int i=0;i<k;i++) if ((i*2*p)%k==1) j=i;
      assert(j!=-1);
      for (int i=0;i<k;i++){
        int a=vec[i];
        int b=vec[(i+j)%k];
        ans[a]=b;
      }
      return j;
    };
    for(int t=0;t<=n;t++){
      int k=g[t].size();
      if (k==0) continue;
      if (t==1){
        for (auto vec:g[t]){
          ans[vec[0]]=vec[0];
        }
      }
      else if (t%2==1){
        for (auto vec:g[t]){
          f(vec);
        }
      }
      else{
        int l=-1;
        for (int i=0;i<t;i++) if ((p*i)%t==1) l=i;
        for (int i=0;i<k/2;i++){
          auto v1=g[t][i*2],v2=g[t][i*2+1];
          for (int j=0;j<t;j++){
            ans[v1[j]]=v2[(j+l)%t];
            ans[v2[j]]=v1[j];
          }
        }
        if (k%2==1){
          auto v=g[t].back();
          int vb=v.back();
          v.pop_back();
          int j=f(v);
          ans[vb]=v[(j+t-2)%(t-1)];
        }
      }
    }
  }
  for (int i=0;i<n;i++){
    assert(ans[i]!=-1);
    cout<<ans[i]+1<<" \n"[i==n-1];
  }
  cout<<flush;
}

int main(){
  int t;
  cin>>t;
  while (t--) solve();
}
0