QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#875675#9731. Fuzzy RankingyuanruiqiRE 1ms3712kbC++262.1kb2025-01-30 01:21:232025-01-30 01:21:24

Judging History

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

  • [2025-01-30 01:21:24]
  • 评测
  • 测评结果:RE
  • 用时:1ms
  • 内存:3712kb
  • [2025-01-30 01:21:23]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
constexpr int maxn = 200000 + 10;
vector<int> e[maxn], g[maxn];
int st[maxn], top;
int vis[maxn];
void dfs1(int u)
{
    vis[u] = 1;
    for (int v : e[u])
    {
        if (vis[v]) continue;
        dfs1(v);
    }
    st[++top] = u;
}
void dfs2(int u, int c)
{
    vis[u] = c;
    for (int v : g[u])
        if (!vis[v]) dfs2(v, c);
}
int siz[maxn];
void solve()
{
    int n, k, q;
    cin >> n >> k >> q;
    for (int i=1;i<=n;++i) e[i].clear(), g[i].clear();
    vector<vector<int> > a(k, vector<int>(n));
    for (int i=0;i<k;++i)
    {
        for (int j=0;j<n;++j) cin >> a[i][j];
        for (int j=1;j<n;++j)
        {
            int x = a[i][j], p = a[i][j - 1];
            e[p].emplace_back(x);
            g[x].emplace_back(p);
        }
    }
    top = 0;
    memset(vis, 0, sizeof(vis[0]) * (n + 5));
    for (int i=1;i<=n;++i) if (!vis[i]) dfs1(i);
    memset(vis, 0, sizeof(vis[0]) * (n + 5));
    int idx = 0;
    for (; top; --top) if (!vis[st[top]]) dfs2(st[top], ++idx);
    vector<vector<i64> > c(k, vector<i64>(n));
    vector<vector<i64> > s(k, vector<i64>(n));
    memset(siz, 0, sizeof(siz[0]) * (idx + 5));
    for (int i=1;i<=n;++i) ++siz[vis[i]];
    for (int i=0;i<k;++i)
    {
        int lst = -1, now = 0;
        i64 sum = 0;
        for (int j=0;j<n;++j)
        {
            if (vis[a[i][j]] == lst) ++now;
            else sum += now * (now - 1) / 2, now = 1, lst = vis[a[i][j]];
            c[i][j] = now;
            s[i][j] = sum + now * (now - 1) / 2;
        }
    }
    i64 x = 0;
    while (q--)
    {
        int t, l, r;
        cin >> t >> l >> r;
        t = (t + x) % k;
        l = (l + x) % n;
        r = (r + x) % n;
        x = s[t][r];
        if (l) x -= s[t][l - 1] + ((a[t][r] == a[t][l - 1] ? c[t][r] : siz[vis[a[t][l - 1]]]) - c[t][l - 1]) * c[t][l - 1];
        cout << x << '\n';
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t;
    cin >> t;
    while (t--) solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3712kb

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
Runtime Error

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:


result: