求助,本机 AC 样例,提交样例 TLE。
  • 板块学术版
  • 楼主sunkuangzheng
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/26 01:31
  • 上次更新2023/11/26 10:27:08
查看原帖
求助,本机 AC 样例,提交样例 TLE。
679936
sunkuangzheng楼主2023/11/26 01:31

输入的 aa 是一个排列。

本机 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";
    }
}
2023/11/26 01:31
加载中...