結果

問題 No.2002 Range Swap Query
ユーザー vwxyzvwxyz
提出日時 2023-03-30 19:27:12
言語 C++17(clang)
(17.0.6 + boost 1.83.0)
結果
AC  
実行時間 1,748 ms / 2,000 ms
コード長 2,311 bytes
コンパイル時間 2,922 ms
コンパイル使用メモリ 139,364 KB
実行使用メモリ 12,416 KB
最終ジャッジ日時 2024-07-08 01:39:52
合計ジャッジ時間 13,982 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 2 ms
5,248 KB
testcase_02 AC 1 ms
5,248 KB
testcase_03 AC 2 ms
5,376 KB
testcase_04 AC 1 ms
5,376 KB
testcase_05 AC 2 ms
5,376 KB
testcase_06 AC 2 ms
5,376 KB
testcase_07 AC 2 ms
5,376 KB
testcase_08 AC 4 ms
5,376 KB
testcase_09 AC 4 ms
5,376 KB
testcase_10 AC 1 ms
5,376 KB
testcase_11 AC 3 ms
5,376 KB
testcase_12 AC 1,748 ms
12,288 KB
testcase_13 AC 1,690 ms
12,288 KB
testcase_14 AC 1,707 ms
12,416 KB
testcase_15 AC 1,585 ms
12,148 KB
testcase_16 AC 105 ms
11,836 KB
testcase_17 AC 486 ms
12,288 KB
testcase_18 AC 107 ms
7,680 KB
testcase_19 AC 457 ms
9,088 KB
testcase_20 AC 75 ms
10,368 KB
testcase_21 AC 73 ms
7,296 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <cstdio>
using namespace std;

int N, K, Q;
vector<int> A, B;
vector<pair<int, pair<int, int>>> query;
vector<int> ans_lst;
int D;

vector<vector<int>> mo;
vector<int> perm;
vector<int> idx;

void init()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> N >> K >> Q;
    A.resize(K);
    B.resize(K);
    for (int k = 0; k < K; k++)
    {
        cin >> A[k] >> B[k];
        A[k]--; B[k]--;
    }
    query.resize(Q);
    for (int q = 0; q < Q; q++)
    {
        int l, r, x;
        cin >> l >> r >> x;
        l--; x--;
        query[q] = {l, {r, x}};
    }
    D = max(1, (int)sqrt(K));
    mo.resize((K+D-1)/D+1);
    for (int q = 0; q < Q; q++)
    {
        int l = query[q].first, r = query[q].second.first;
        mo[l/D].push_back(q);
    }
    perm.resize(N);
    idx.resize(N);
    for (int i = 0; i < N; i++)
    {
        perm[i] = i;
        idx[i] = i;
    }
}

void solve()
{
    ans_lst.resize(Q);
    int L = 0, R = 0;
    for (int d = 0; d < (K+D-1)/D+1; d++)
    {
        sort(mo[d].begin(), mo[d].end(), [&](int i, int j) {
            return query[i].second.first > query[j].second.first;
        });
        for (int q : mo[d])
        {
            int l = query[q].first, r = query[q].second.first, x = query[q].second.second;
            while (L > l)
            {
                L--;
                swap(idx[A[L]], idx[B[L]]);
                swap(perm[idx[A[L]]], perm[idx[B[L]]]);
            }
            while (R < r)
            {
                swap(perm[A[R]], perm[B[R]]);
                idx[perm[A[R]]] = A[R];
                idx[perm[B[R]]] = B[R];
                R++;
            }
            while (L < l)
            {
                swap(idx[A[L]], idx[B[L]]);
                swap(perm[idx[A[L]]], perm[idx[B[L]]]);
                L++;
            }
            while (r < R)
            {
                R--;
                swap(perm[A[R]], perm[B[R]]);
                idx[perm[A[R]]] = A[R];
                idx[perm[B[R]]] = B[R];
            }
            ans_lst[q] = perm[x]+1;
        }
    }
    for (int i = 0; i < Q; i++)
    {
        cout << ans_lst[i] << '\n';
    }
}

int main()
{
    init();
    solve();
    return 0;
}
0