输入的 a 是一个排列。
本机 windows 和 linux 虚拟机测试样例都可以正常输出,但是 CF 上样例 TLE 了。
/**
* author: sunkuangzheng
* created: 26.11.2023 00:41:39
**/
#include<bits/stdc++.h>
#ifdef DEBUG_LOCAL
#include <mydebug/debug.h>
debug_helper deg;
#endif
using namespace std;
const int N = 1e6+5;
int t,n,a[N],ans[N],b[N],c[N];
int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin >> t;
while(t --){
cin >> n;int ti = 0;set<int> s;
for(int i = 1;i <= n;i ++) cin >> a[i],ans[i] = 1e9,s.insert(i);
while(s.size()){
int cnt = 0,pi = 1e9;vector<int> p;int lst = 0;
for(int i : s) if(i == a[i]) ans[i] = ti,s.erase(i);
if(!s.size()) break;
for(int i : s) b[i] = b[lst] + 1,lst = i;b[n] = b[lst];
for(int i : s){
int dis = 0;
if(a[i] > i) dis = b[a[i]] - b[i];
else dis = b[n] - b[i] + b[a[i]];
pi = min(pi,dis),p.push_back(i);
}ti += pi;int m = p.size();
for(int i = 0;i < p.size();i ++) c[p[(i + pi) % m]] = a[p[i]];
for(int i : s) a[i] = c[i];
}for(int i = 1;i <= n;i ++) cout << ans[i] << " ";cout << "\n";
}
}