結果

問題 No.3529 2p Teleportations
コンテスト
ユーザー Carpenters-Cat
提出日時 2026-05-04 22:39:51
言語 C++17
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++17 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
WA  
実行時間 -
コード長 1,786 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,570 ms
コンパイル使用メモリ 228,848 KB
実行使用メモリ 7,976 KB
最終ジャッジ日時 2026-05-04 22:40:12
合計ジャッジ時間 17,227 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge2_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 1 WA * 43 RE * 5
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;
void solve() {
	int N, p;
	cin >> N >> p;
	std::vector<int> A(N);
	for (auto& a : A) {
		cin >> a;
		a--;
	}
	auto B = A;
	for (int i = 0; i < N; i ++) {
		B[A[i]] = i;
	}
	vector<int> ans(N);
	vector<vector<int>> C;
	{
		vector<int> D(N, 0);
		for (int i =0; i < N; i ++) {
			if (D[i]) continue;
			vector<int> X;
			int fl = i;
			while (!D[fl]) {
				D[fl] = 1;
				X.push_back(fl);
				fl = B[i];
			}
			C.push_back(X);
		}
	}
	sort(C.begin(), C.end(), [](vector<int>& a, vector<int>& b) {return a.size() < b.size();});
	{
		int fl = 0;
		while (fl < C.size()) {
			auto& v1 = C[fl];
			if (v1.size() & 1) {
				int r = (p*2) % v1.size();
				auto v2 = v1;
				for (long long i = 0; i < v1.size(); i ++) {
					v2[(i*r) % v1.size()] = v1[i];
				}
				v2.push_back(v2[0]);
				for (int i = 0; i < v1.size(); i ++) {
					ans[v2[i]] = v2[i+1];
				}
			} else if (fl + 1 < C.size() && C[fl].size() == C[fl+1].size()) {
				auto& v2 = C[++fl];
				int s = v1.size();
				vector<int> X(s*2);
				int r = (2*p) % (s*2);
				for (long long i = 0; i < s; i ++) {
					X[(i*r) % (s*2)] = v1[i];
				}
				for (long long i = 0; i < s; i ++) {
					X[(i*r) % (s*2)+1] = v2[i];
				}
				X.push_back(X[0]);
				for (int i = 0; i < s*2; i ++) {
					ans[X[i]] = X[i+1];
				}
			} else {
				int s = v1.size();
				vector<int> X(s-1);
				int r = (2*p) % (s-1);
				for (long long i = 0; i < s-1; i ++) {
					X[(i*r) % (s-1)] = v1[i];
				}
				X.push_back(X[0]);
				for (int i = 0; i < s*2; i ++) {
					ans[X[i]] = X[i+1];
				}
				ans[v1.back()] = X[(1-r+(s-1)) % (s-1)];
			}
			fl ++;
		}
	}
	for(int i = 0; i < N; i ++) {
		cout << (i ? " " : "") << ans[i]+1;
	}
	cout << endl;
}
int main () {
	int T;
	cin >> T;
	while (T--) solve();
}
0