QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#856019 | #9731. Fuzzy Ranking | icpc_zhzx034# | RE | 0ms | 30232kb | C++14 | 2.7kb | 2025-01-13 15:06:09 | 2025-01-13 15:06:11 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
struct edge {
int to, Next;
edge() {}
edge(int to, int Next): to(to), Next(Next) {}
} G[N << 1];
int head[N], cnt;
inline void add_edge(int u, int v) {
G[++cnt] = edge(v, head[u]);
head[u] = cnt;
}
int T, n, q, k, c[N];
vector <int> a[N], pre[N], suf[N];
vector <ll> sum[N], Sum[N];
int dfn[N], low[N], tot, col;
stack <int> S;
bitset <N> vis;
inline void Tarjan(int u) {
S.push(u);
dfn[u] = low[u] = ++tot;
vis[u] = 1;
for (int i = head[u]; i; i = G[i].Next) {
int v = G[i].to;
if (!dfn[v]) {
Tarjan(v);
low[u] = min(low[u], low[v]);
} else if (vis[u]) {
low[u] = min(low[u], dfn[v]);
}
}
if (dfn[u] == low[u]) {
++col;
while (!S.empty()) {
int v = S.top();
S.pop();
vis[v] = 0;
c[v] = col;
if (v == u) {
break;
}
}
}
}
ll ans;
inline void solve() {
cin >> n >> q >> k;
for (int i = 1; i <= n; ++i) {
head[i] = 0;
dfn[i] = 0;
vis[i] = 0;
}
cnt = tot = col = 0;
for (int i = 1; i <= k; ++i) {
a[i].resize(n + 1);
for (int j = 1; j <= n; ++j) {
cin >> a[i][j];
}
for (int j = 1; j < n; ++j) {
add_edge(a[i][j], a[i][j + 1]);
}
}
for (int i = 1; i <= n; ++i) {
if (!dfn[i]) {
Tarjan(i);
}
}
for (int i = 1; i <= k; ++i) {
pre[i].resize(n + 1);
for (int j = 1; j <= n; ++j) {
if (c[a[i][j]] == c[a[i][j - 1]]) {
pre[i][j] = pre[i][j - 1];
} else {
pre[i][j] = j;
}
}
suf[i].resize(n + 1);
for (int j = n; j; --j) {
if (j != n && c[a[i][j]] == c[a[i][j + 1]]) {
suf[i][j] = suf[i][j + 1];
} else {
suf[i][j] = j;
}
}
sum[i].resize(n + 1);
Sum[i].resize(n + 1);
for (int j = 1; j <= n; ++j) {
if (j == n || c[a[i][j]] != c[a[i][j + 1]]) {
ll len = j - pre[i][j] + 1;
sum[i][j] = len * (len - 1) / 2;
} else {
sum[i][j] = 0;
}
Sum[i][j] = sum[i][j] + Sum[i][j - 1];
}
}
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;
if (c[a[id][l]] == c[a[id][r]]) {
ans = (ll)(r - l + 1) * (r - l) / 2;
} else {
ans = 0;
ans += Sum[id][r - 1] - Sum[id][l - 1];
ans -= sum[id][suf[id][l]];
ans += (ll)(r - pre[id][r] + 1) * (r - pre[id][r]) / 2;
ans += (ll)(suf[id][l] - l + 1) * (suf[id][l] - l) / 2;
}
cout << ans << "\n";
}
}
int main() {
#ifdef LOCAL
assert(freopen("test.in", "r", stdin));
assert(freopen("test.out", "w", stdout));
#endif
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin >> T;
while (T--) {
solve();
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 30232kb
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 ...