結果
| 問題 | No.3529 2p Teleportations |
| コンテスト | |
| ユーザー |
tau1235
|
| 提出日時 | 2026-05-04 23:50:56 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 247 ms / 2,000 ms |
| コード長 | 1,825 bytes |
| 記録 | |
| コンパイル時間 | 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 |
ソースコード
#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();
}
tau1235