QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#740400 | #9731. Fuzzy Ranking | 0x3fffffff | WA | 26ms | 3536kb | C++23 | 3.7kb | 2024-11-13 09:43:48 | 2024-11-13 09:43:53 |
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);
map<pair<int, int>, int>hav;
for (int t = 1;t <= k;t++) {
for (int i = 1;i < n;i++) {
if (!hav.count({ a[t][i],a[t][i + 1] })) {
scc.add(a[t][i], a[t][i + 1]);
// cerr << " " << t << " " << i << "\n";
// cerr << a[t][i] << " " << a[t][i + 1] << "\n";
}
hav[{a[t][i], a[t][i + 1]}] = 1;
}
}
scc.work();
auto g = scc.compass();
// for (int i = 1;i <= n;i++) {
// cerr << scc.scc[i] << " ";
// }
// cerr << "\n";
vector<LL>pre(n + 1);
unordered_map<int, int>mp;
for (int i = 1;i <= n;i++) {
int x = a[1][i];
if (mp.count(scc.scc[x])) {
pre[i] = pre[i - 1] + mp[scc.scc[x]];
}
else {
pre[i] = pre[i - 1];
}
mp[scc.scc[x]]++;
// cout << scc.scc[x] << " ";
}
// cout << "\n";
// for (int i = 1;i <= n;i++) {
// cout << pre[i] << " ";
// }
// cout << "\n";
LL v = 0;
while (q--) {
LL 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];
// cout << pre[r] << " " << pre[l] << "\n";
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: 3536kb
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: 26ms
memory: 3508kb
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 2 0 1 1 2 1 2 4 4 3 4 15 24 0 0 14 30 18 28 35 0 3 10 6 17 12 10 18 17 3 2 5 3 3 0 4 5 3 4 1 2 1 3 3 0 3 4 4 4 4 0 0 1 1 2 0 0 1 2 1 2 0 0 1 4 3 0 4 4 2 13 18 28 28 0 11 16 7 11 18 1 4 2 0 0 2 0 1 2 4 0 0 0 0 0 0 0 0 0 0 2 6 0 6 3 0 3 5 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 2 3 2 0 0 3 3...
result:
wrong answer 11th lines differ - expected: '1', found: '2'