QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#853628#9731. Fuzzy Rankingucup-team6275#WA 28ms3640kbC++204.1kb2025-01-11 17:53:192025-01-11 17:53:19

Judging History

This is the latest submission verdict.

  • [2025-01-11 17:53:19]
  • Judged
  • Verdict: WA
  • Time: 28ms
  • Memory: 3640kb
  • [2025-01-11 17:53:19]
  • Submitted

answer

#include <iostream>
#include <vector>
#include <array>
#include <string>
#include <algorithm>
#include <iomanip>
#include <map>
#include <deque>
#include <set>
#include <random>

using namespace std;
#define ll long long
const int INF = 1e9;
vector <int> st;

void dfs(int v, vector <vector <int>>& g, vector <int>& used) {
    used[v] = 1;
    st.push_back(v);
    for (int i : g[v]) {
        if (!used[i]) dfs(i, g, used);
    }
}

void calc_dp(int v, vector <vector <int>>& g, vector <int>& dp, vector <int>& used) {
    if (used[v]) return;
    used[v] = 1;
    for (int i : g[v]) {
        calc_dp(i, g, dp, used);
        dp[v] = min(dp[v], dp[i]);
    }
}

void solve() {
    int n, k, q;
    cin >> n >> k >> q;
    vector <vector <int>> a(k, vector <int> (n));
    vector <vector <int>> pa(k, vector <int> (n));
    for (int i = 0; i < k; ++i) {
        for (int j = 0; j < n; ++j) {
            cin >> a[i][j]; --a[i][j];
            pa[i][a[i][j]] = j;
        }
    }

    vector <int> minl(n);
    for (int i = 0; i < n; ++i) {
        minl[a[0][i]] = i;
    }

    for (int i = 1; i < k; ++i) {
        vector <vector <int>> gg(n);
        for (int j = 0; j < n - 1; ++j) {
            gg[a[i - 1][j]].push_back(a[i - 1][j + 1]);
            gg[a[i][j]].push_back(a[i][j + 1]);
        }
        for (int j = 0; j < n; ++j) {
            int val = a[i - 1][j];
            if (minl[val] != j) gg[val].push_back(a[i - 1][val]);
        }
        vector <int> dp(n);
        for (int j = 0; j < n; ++j) {
            dp[a[i][j]] = j;
        }
        vector <int> used(n);
        for (int j = 0; j < n; ++j) {
            if (!used[j]) {
                calc_dp(j, gg, dp, used);
            }
        }

        minl = dp;
    }

    vector <vector <int>> g(n);
    for (int i = 0; i < n; ++i) {
        if (minl[a[k - 1][i]] < i) {
            g[a[k - 1][i]].push_back(a[k - 1][i - 1]);
            g[a[k - 1][i - 1]].push_back(a[k - 1][i]);
        }
    }
    vector <int> used(n);
    vector <int> sz(n);

    for (int i = 0; i < n; ++i) {
        st.clear();
        if (!used[i]) {
            dfs(i, g, used);
            for (int j : st) {
                sz[j] = st.size();
            }
        }
    }

    vector <vector <int>> lens(k);
    vector <vector <int>> psum(k);
    vector <vector <ll>> psum2(k);

    for (int i = 0; i < k; ++i) {
        int jj = n - 1;

        while (jj >= 0) {
            lens[i].push_back(sz[a[i][jj]]);
            jj -= sz[a[i][jj]];
        }
        reverse(lens[i].begin(), lens[i].end());
        int ln = lens[i].size();
        psum[i].resize(ln + 1);
        for (int j = 0; j < ln; ++j) {
            psum[i][j + 1] = psum[i][j] + lens[i][j];
        }
        psum2[i].resize(ln + 1);
        for (int j = 0; j < ln; ++j) {
            psum2[i][j + 1] = psum2[i][j] + 1ll * lens[i][j] * (lens[i][j] - 1) / 2;
        }
    }

    ll v = 0;

    while (q--) {
        int id, l, r;
        cin >> id >> l >> r;
        id = (id + v) % k;
        l = (l + v) % n;
        r = (r + v) % n;

        auto it_l = lower_bound(psum[id].begin(), psum[id].end(), l);
        auto it_r = lower_bound(psum[id].begin(), psum[id].end(), r + 1);
        ll len = r - l + 1;
        ll cur_val = 0;

        if (it_l == it_r) {
            cout << len * (len - 1) / 2 << "\n";
            v = len * (len - 1) / 2;
            continue;
        }

        cur_val += psum2[id][it_r - psum[id].begin() - 1] - psum2[id][it_l - psum[id].begin()];
        ll len_l = *it_l - l;
        ll len_r = (r + 1) - *(it_r - 1);

        cur_val += len_l * (len_l - 1) / 2;
        cur_val += len_r * (len_r - 1) / 2;
        v = cur_val;
        cout << cur_val << "\n";
    }
}

signed main() {
    if (1) {
        ios_base::sync_with_stdio(false);
        cin.tie(nullptr);
    }
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

/*
2
5 2 2
1 2 3 4 5
5 4 3 2 1
1 0 2
1 2 1
5 3 3
1 2 3 4 5
1 3 2 4 5
1 2 3 5 4
0 0 2
0 2 3
1 0 3
 */

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3504kb

input:

2
5 2 2
1 2 3 4 5
5 4 3 2 1
1 0 2
1 2 1
5 3 3
1 2 3 4 5
1 3 2 4 5
1 2 3 5 4
0 0 2
0 2 3
1 0 3

output:

3
10
1
1
2

result:

ok 5 lines

Test #2:

score: -100
Wrong Answer
time: 28ms
memory: 3640kb

input:

2000
10 10 10
4 5 3 6 8 9 2 1 7 10
4 5 6 3 8 9 1 2 10 7
5 4 3 6 8 9 1 2 7 10
4 5 6 3 8 9 1 2 7 10
4 5 3 6 8 9 2 1 10 7
4 5 6 3 8 9 1 2 10 7
5 4 6 3 8 9 1 2 7 10
5 4 6 3 8 9 1 2 10 7
4 5 6 3 8 9 2 1 7 10
5 4 3 6 8 9 2 1 10 7
3 1 6
5 7 8
0 2 3
7 9 9
2 1 9
6 1 6
7 2 3
0 0 4
1 8 1
1 8 7
10 10 10
9 10 5 ...

output:

2
-6
1
0
5
-3
0
2
2
6
1
0
3
0
3
3
3
0
0
0
1
6
28
0
0
10
10
6
6
15
0
3
15
15
36
6
21
1
6
1
3
-8
15
0
3
-6
3
-6
63
-8
1
2
-1
1
0
7
6
0
-8
3
0
1
28
3
0
1
6
3
0
15
1
0
0
3
0
-6
0
12
0
3
3
6
16
16
0
11
16
1
4
15
0
-1
-5
3
1
10
3
10
4
9
0
0
0
0
0
0
0
0
0
0
1
0
0
5
3
0
2
7
-8
1
0
0
0
0
0
0
0
0
0
0
7
0
0
6
...

result:

wrong answer 1st lines differ - expected: '1', found: '2'