結果

問題 No.3529 2p Teleportations
コンテスト
ユーザー The Forsaking
提出日時 2026-05-07 01:45:11
言語 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  
実行時間 -
コード長 3,195 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,658 ms
コンパイル使用メモリ 222,400 KB
実行使用メモリ 8,404 KB
最終ジャッジ日時 2026-05-07 01:45:37
合計ジャッジ時間 16,557 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 2 WA * 47
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>

using namespace std;

using pii = pair<int, int>;
using ll = long long;
const int N = 2000010, MOD = 998244353, INF = 0x3f3f3f3f;
int n, m, w[N];

int a[N];

void solve() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i < n + 1; i++) scanf("%d", w + i), a[w[i]] = i;
    vector<bool> st(n + 1);
    vector<int> stk, ans(n + 1);
    vector<vector<vector<int> > > p(n + 1);
    for (int i = 1; i < n + 1; i++) 
        if (!st[i]) {
            stk.push_back(i);
            st[i] = 1;
            int ne = i;
            while (!st[a[ne]]) ne = a[ne], st[ne] = 1, stk.push_back(ne);
            if (stk.size() == 1) ans[stk.back()] = i;
            else {
                int len = stk.size(), t = m * 2 % len;
                // assert(len == 2 || t);
                if (__gcd(t, len) == 1) {
                    vector<int> q(stk.size());
                    int now = 0;
                    for (int i = 0; i < len; i++) {
                        q[now] = stk[i];
                        now = (now + t) % len;
                    }
                    for (int i = 0; i < len; i++) {
                        ans[q[i]] = q[(i + 1) % len];
                    }
                } else {
                    // assert(len == 2 || __gcd(len, t) == 2);
                    p[len].push_back(stk);
                }
            }
            stk.clear();
        }
    for (int i = 2; i <= n; i += 2) {
        while (p[i].size() > 1) {
            auto a = p[i].back(); p[i].pop_back();
            auto b = p[i].back(); p[i].pop_back();
            vector<int> q(i << 1);
            int now = 0, t = m * 2 % (i << 1);
            // assert(__gcd(i << 1, t) <= 2);
            for (int j = 0; j < i; j++) {
                q[now] = a[j];
                now = (now + t) % i;
            }
            now = 1;
            for (int j = 0; j < i; j++) {
                q[now] = a[j];
                now = (now + t) % i;
            }
            for (int j = 0; j < (i << 1); j++) ans[q[j]] = q[(j + 1) % (i << 1)];
        }
        if (p[i].size()) {
            auto u = p[i].back();
            int x = u.back(); u.pop_back();
            int len = u.size(), t = m * 2 % len;
            // assert(__gcd(len, t) == 1);
            vector<int> q(u.size());
            int now = 0;
            for (int i = 0; i < len; i++) {
                q[now] = u[i];
                now = (now + t) % len;
            }
            for (int i = 0; i < len; i++) {
                ans[q[i]] = q[(i + 1) % len];
            }
            ans[x] = q[0];
        }
    }
    for (int i = 1; i < n + 1; i++) printf("%d ", ans[i]);
    puts("");
    return;

    vector<int> f(n + 1), g(n + 1);
    for (int i = 1; i < n + 1; i++) f[i] = a[i];
    for (int i = 1; i < m * 2 + 1; i++) {
        fill(g.begin(), g.end(), 0);
        for (int j = 1; j < n + 1; j++)
            if (f[j])
                g[ans[j]] = f[j];
        swap(g, f);
    }
    int sum = 0;
    for (int i = 1; i < n + 1; i++) sum += f[i] != i;
    // printf("%d %d\n", sum, (int)sqrt(n));
    assert(sum <= sqrt(n));
}

int main() {
    int T = 1;
    scanf("%d", &T);
    while (T--) solve();
    return 0;
}
0