QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#741777#9731. Fuzzy RankingTMM233#WA 12ms3636kbC++233.6kb2024-11-13 15:12:512024-11-13 15:12:51

Judging History

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

  • [2024-11-25 12:28:53]
  • hack成功,自动添加数据
  • (/hack/1257)
  • [2024-11-13 15:12:51]
  • 评测
  • 测评结果:WA
  • 用时:12ms
  • 内存:3636kb
  • [2024-11-13 15:12:51]
  • 提交

answer

#include <bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
const int maxn = 1e6 + 5;
class tarjan {
public :
    vector<int> stk;
    vector<int> fdn, low, color;
    vector<bool> vis;
    vector<vector<int>> to;
    int cnt = 0, step = 0;
    int _n;
    void add_edge(int u, int v)
    {
        to[u].push_back(v);
    }
    tarjan(int n)
    {

        _n = n;
        fdn.assign(n, 0);
        low.assign(n, 0);
        color.assign(n, 0);
        vis.assign(n, 0);
        to.assign(n, vector<int>());
    }
    void dfs(int x)
    {
        vis[x] = 1;
        fdn[x] = low[x] = ++step;
        stk.push_back(x);
        for (auto i : to[x])
        {
            int v = i;
            if (!fdn[v])
            {
                dfs(v);
                low[x] = min(low[v], low[x]);
            }
            else if (vis[v])
            {
                low[x] = min(low[x], fdn[v]);
            }
        }
        if (fdn[x] == low[x])
        {
            vis[x] = 0;
            color[x] = ++cnt;
            int i = stk.size() - 1;
            while (stk[i] != x)
            {
                vis[stk[i]] = 0;
                color[stk[i]] = cnt;
                stk.pop_back();
                i--;
            }
            stk.pop_back();
        }
    }
    auto work()
    {
        for (int i = 1; i < _n; i++)
        {
            if (!fdn[i])
                dfs(i);
        }
        return color;
    }
};
void solve() {
    int n, k, q; cin >> n >> k >> q;
    tarjan tar(n + 1);
    vector< vector< int > > a(k + 1, vector< int >(n + 1, 0));
    vector< vector< int > > c(k + 1, vector< int >(n + 1, 0));

    vector< vector< int > > lst(k + 1, vector< int >(n + 2, 0));
    vector< vector< int > > nxt(k + 1, vector< int >(n + 2, 0));
    vector< vector< int > > pre(k + 1, vector< int >(n + 2, 0));

    for(int i = 1; i <= k; i++) {
        for(int j = 1; j <= n; j++) {
            cin >> a[i][j];
            if(j != 1) {
                tar.add_edge(a[i][j - 1], a[i][j]);
            }
        }
    }
    vector< int > col = tar.work();
    for(int i = 1; i <= k; i++) {
        for(int j = 1; j <= n; j++) {
            c[i][j] = col[a[i][j]];
        }
    }
    
    for(int i = 1; i <= k; i++) {
        int cur = 0, pc = 0;
        for(int j = 1; j <= n; j++) {
            if(c[i][j] == c[i][j - 1]) {
                nxt[i][j] = nxt[i][j - 1];
                cur++;
            }
            else {
                pre[i][j - 1] = pre[i][pc] + cur * (cur - 1) / 2;
                nxt[i][j] = j;
                cur = 1; pc = j - 1;
            }
        }
        for(int j = n; j >= 1; j--) {
            if(c[i][j] == c[i][j + 1]) {
                lst[i][j] = lst[i][j + 1];
            }
            else {
                lst[i][j] = j;
            }
        }

    }

    int ans = 0;
    while(q--) {
        int id, l, r; cin >> id >> l >> r;
        id = (id + ans) % k + 1;
        l = (l + ans) % n + 1;
        r = (r + ans) % n + 1;
        
        int l_ = lst[id][l];
        if(l_ >= r) {
            int len = (r - l + 1);
            ans = len * (len - 1) / 2;
        }
        else {
            int r_ = nxt[id][r];
            int len1 = (l_ - l + 1);
            int len2 = (r - r_ + 1);
            ans = len1 * (len1 - 1) / 2 + len2 * (len2 - 1) / 2 + pre[id][r_ - 1] - pre[id][l_];
        }

        cout << ans << '\n';
    }  
}
signed main() {
    ios::sync_with_stdio(0), cin.tie(0);
    int t = 1;
    cin >> t;
    while (t--)
        solve();
}

詳細信息

Test #1:

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

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: 12ms
memory: 3636kb

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:

1
1
0
0
3
2
0
2
2
4
1
0
1
1
1
1
2
4
4
3
1
6
28
0
0
10
10
6
6
15
0
3
10
6
16
6
11
1
2
1
1
6
3
3
0
4
5
3
4
1
1
3
2
4
0
3
4
4
4
4
0
0
1
1
2
0
0
1
2
1
1
0
0
1
4
3
0
4
4
1
3
6
16
16
0
11
16
1
4
15
1
4
2
0
0
2
0
1
2
4
0
0
0
0
0
0
0
0
0
0
1
0
0
6
3
0
3
4
0
0
0
0
0
0
0
0
0
0
0
0
3
0
0
1
3
1
0
0
3
3
9
1
9
4
...

result:

wrong answer 177th lines differ - expected: '10', found: '26'