QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#755830#9731. Fuzzy Rankingelectricstick#RE 0ms0kbC++172.8kb2024-11-16 18:09:192024-11-16 18:09:20

Judging History

你现在查看的是最新测评结果

  • [2024-11-25 12:28:53]
  • hack成功,自动添加数据
  • (/hack/1257)
  • [2024-11-16 18:09:20]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2024-11-16 18:09:19]
  • 提交

answer

#include<cstdio>
#include<vector>
#include<algorithm>
const int N = 2e5 + 10;
int n, m, q;
long long ans;
std::vector<int> a[N], g[N], rr[N], ll[N];
std::vector<long long> b[N];
int dfn[N], low[N], ins[N], bel[N], stk[N], top, siz[N];
int cnt, tot;
int fmin(int &a, int b){if(a > b) a = b;}
void dfs(int u) {
    low[u] = dfn[u] = ++cnt;
    stk[++top] = u;
    for(auto v: g[u]) {
        if(!dfn[v]) {
            dfs(v);
            fmin(low[u], low[v]);
        } else {
            if(ins[v]) {
                fmin(low[u], dfn[v]);
            }
        }
    }
    if(low[u] >= dfn[u]) {
        ++tot;
        while(true) {
            int x = stk[top--];
            ins[x] = false;
            bel[x] = tot;
            if(x == u) break;
            ++siz[x];
        }
    }
}
int main() {
    int t; scanf("%d", &t);
    while(t--) {
        scanf("%d%d%d", &n, &m, &q);
        for(int i = 1; i <= m; i++) {
            a[i].resize(n + 5);
            b[i].assign(n + 5, 0);
            for(int j = 1; j <= n; j++) {
                scanf("%d", &a[i][j]);
                if(j > 1) {
                    g[a[i][j - 1]].push_back(a[i][j]);
                }
            }
        }
        cnt = tot = top = 0;
        dfs(1);
        for(int i = 1; i <= m; i++) {
            for(int j = 1; j <= n; j++) {
                if(bel[a[i][j]] != bel[a[i][j - 1]]) {
                    ll[i].push_back(j);
                    if(j > 1) {
                        rr[i].push_back(j - 1);
                    }
                }
            }
            rr[i].push_back(n);
            for(int j = 0; j < ll[i].size(); ++j) {
                int l = ll[i][j], r = rr[i][j];
                int n = r - l + 1;
                b[i][l] = n * (n - 1ll) / 2;
            }
            for(int j = 1; j <= n; j++) {
                b[i][j] += b[i][j - 1];
            }
        }
        while(q--) {
            int i, l, r; scanf("%d%d%d", &i, &l, &r);
            i = (i + ans) % m + 1;
            l = (l + ans) % n + 1;
            r = (r + ans) % n + 1;
            ans = 0;
            int lr = *std::lower_bound(rr[i].begin(), rr[i].end(), l);
            int rl = *--std::upper_bound(ll[i].begin(), ll[i].end(), r);
            if(lr <= r && rl >= l) {
                ans = b[i][rl - 1] - b[i][lr];
                int n = rl - l + 1;
                ans += n * (n - 1ll) / 2;
                n = r - rl + 1;
                ans += n * (n - 1ll) / 2;
            } else {
                int n = r - l + 1;
                ans += n * (n - 1ll) / 2;
            }
            printf("%lld\n", ans);
        }
        for(int i = 1; i <= n; i++) {
            g[i].clear();
        }
        for(int i = 1; i <= m; i++) {
            a[i].clear();
            b[i].clear();
            ll[i].clear();
            rr[i].clear();
        }
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Runtime Error

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:


result: