QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#756797#9731. Fuzzy RankingelectricstickWA 2ms5864kbC++232.5kb2024-11-16 21:58:582024-11-16 21:58:58

Judging History

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

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

answer

#include <algorithm>
#include <cstdio>
#include <vector>
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;
void 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--) {
    ans = 0;
    scanf("%d%d%d", &n, &m, &q);
    for (int i = 1; i <= m; i++) {
      a[i].assign(n + 5, 0);
      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];
        long long n = r - l + 1;
        b[i][l] = n * (n - 1) / 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];
        long long n = rl - l + 1;
        ans += n * (n - 1) / 2;
        n = r - rl + 1;
        ans += n * (n - 1) / 2;
      } else {
        long long n = r - l + 1;
        ans += n * (n - 1) / 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;
}

详细

Test #1:

score: 0
Wrong Answer
time: 2ms
memory: 5864kb

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
3
1
6

result:

wrong answer 3rd lines differ - expected: '1', found: '3'