QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#740357 | #9731. Fuzzy Ranking | 0x3fffffff | WA | 17ms | 3668kb | C++23 | 3.3kb | 2024-11-13 09:19:37 | 2024-11-13 09:19:38 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
struct SCC {
vector<int>dfn, low, scc, siz;
vector<int>stk, instk;
vector<vector<int>>e, g;
int n, tot, cnt;
SCC() {};
SCC(int n) {
this->n = n;
dfn.resize(n + 1);
low.resize(n + 1);
scc.resize(n + 1);
instk.resize(n + 1);
siz.resize(n + 1);
e.assign(n + 1, {});
g.assign(n + 1, {});
tot = cnt = 0;
}
void add(int a, int b) {
e[a].push_back(b);
}
void work() {
for (int i = 1;i <= n;i++) {
if (!dfn[i])
tarjan(i);
}
}
void tarjan(int u) {
dfn[u] = low[u] = ++tot;
stk.push_back(u);
instk[u] = 1;
for (int v : e[u]) {
if (!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if (instk[v]) {
low[u] = min(dfn[v], low[u]);
}
}
if (dfn[u] == low[u]) {
++cnt;int v;
do {
v = stk.back();stk.pop_back();
instk[v] = 0;
scc[v] = cnt;
g[cnt].push_back(v);
siz[cnt]++;
} while (v != u);
}
}
struct Graph {
int n;
vector<vector<int>>ne;
vector<int>indeg;
};
Graph compass() {
Graph G;
G.n = cnt;
G.indeg.resize(cnt + 1);
G.ne.resize(cnt + 1);
for (int u = 1;u <= n;u++) {
for (int v : e[u]) {
if (scc[v] == scc[u])continue;
G.ne[scc[u]].push_back(scc[v]);
G.indeg[scc[v]]++;
}
}
return G;
}
};
using LL = long long;
void solve() {
int n, k, q;
cin >> n >> k >> q;
vector a(k + 1, vector<int>(n + 1));
for (int t = 1;t <= k;t++) {
for (int i = 1;i <= n;i++) {
cin >> a[t][i];
}
}
SCC scc(n);
for (int t = 1;t <= k;t++) {
for (int i = 1;i < n;i++) {
scc.add(a[t][i], a[t][i + 1]);
}
}
scc.work();
auto g = scc.compass();
// for (int i = 1;i <= n;i++) {
// cout << scc.scc[i] << " ";
// }
// cout << "\n";
vector<LL>pre(n + 1);
unordered_map<int, int>mp;
for (int i = 1;i <= n;i++) {
if (mp.count(scc.scc[i])) {
pre[i] = pre[i - 1] + mp[scc.scc[i]];
}
else {
pre[i] = pre[i - 1];
}
mp[scc.scc[i]]++;
}
// for (int i = 1;i <= n;i++) {
// cout << pre[i] << " ";
// }
// cout << "\n";
LL v = 0;
while (q--) {
int id, l, r;
cin >> id >> l >> r;
id = (id + v) % k + 1, l = (l + v) % n + 1, r = (r + v) % n + 1;
if (l > r)swap(l, r);
// cout << l << " " << r << "\n";
v = pre[r] - pre[l - 1];
cout << v << "\n";
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
#ifdef LOCAL
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif
cin >> T;
while (T--)
solve();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3668kb
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: 17ms
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:
3 1 1 0 4 3 1 3 2 4 3 0 1 2 1 0 1 4 4 3 7 30 10 7 8 42 25 44 18 39 0 3 15 16 18 11 10 18 18 9 3 8 3 1 1 8 1 5 10 6 1 4 2 4 0 2 3 2 4 2 1 0 0 2 0 0 1 2 0 2 2 1 0 1 4 3 0 4 4 2 18 4 18 29 1 16 7 29 22 25 1 3 3 4 1 4 5 3 3 3 0 0 0 0 0 0 0 0 0 0 2 3 0 4 6 2 3 6 3 0 0 0 0 0 0 0 0 0 0 0 5 1 0 1 5 1 1 1 1 ...
result:
wrong answer 1st lines differ - expected: '1', found: '3'