QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#853523 | #9731. Fuzzy Ranking | ucup-team5234# | WA | 0ms | 3628kb | C++23 | 5.2kb | 2025-01-11 17:20:49 | 2025-01-11 17:20:51 |
Judging History
answer
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
namespace atcoder {
namespace internal {
template <class E> struct csr {
std::vector<int> start;
std::vector<E> elist;
explicit csr(int n, const std::vector<std::pair<int, E>>& edges)
: start(n + 1), elist(edges.size()) {
for (auto e : edges) {
start[e.first + 1]++;
}
for (int i = 1; i <= n; i++) {
start[i] += start[i - 1];
}
auto counter = start;
for (auto e : edges) {
elist[counter[e.first]++] = e.second;
}
}
};
} // namespace internal
} // namespace atcoder
namespace atcoder {
namespace internal {
// Reference:
// R. Tarjan,
// Depth-First Search and Linear Graph Algorithms
struct scc_graph {
public:
explicit scc_graph(int n) : _n(n) {}
int num_vertices() { return _n; }
void add_edge(int from, int to) { edges.push_back({from, {to}}); }
// @return pair of (# of scc, scc id)
std::pair<int, std::vector<int>> scc_ids() {
auto g = csr<edge>(_n, edges);
int now_ord = 0, group_num = 0;
std::vector<int> visited, low(_n), ord(_n, -1), ids(_n);
visited.reserve(_n);
auto dfs = [&](auto self, int v) -> void {
low[v] = ord[v] = now_ord++;
visited.push_back(v);
for (int i = g.start[v]; i < g.start[v + 1]; i++) {
auto to = g.elist[i].to;
if (ord[to] == -1) {
self(self, to);
low[v] = std::min(low[v], low[to]);
} else {
low[v] = std::min(low[v], ord[to]);
}
}
if (low[v] == ord[v]) {
while (true) {
int u = visited.back();
visited.pop_back();
ord[u] = _n;
ids[u] = group_num;
if (u == v) break;
}
group_num++;
}
};
for (int i = 0; i < _n; i++) {
if (ord[i] == -1) dfs(dfs, i);
}
for (auto& x : ids) {
x = group_num - 1 - x;
}
return {group_num, ids};
}
std::vector<std::vector<int>> scc() {
auto ids = scc_ids();
int group_num = ids.first;
std::vector<int> counts(group_num);
for (auto x : ids.second) counts[x]++;
std::vector<std::vector<int>> groups(ids.first);
for (int i = 0; i < group_num; i++) {
groups[i].reserve(counts[i]);
}
for (int i = 0; i < _n; i++) {
groups[ids.second[i]].push_back(i);
}
return groups;
}
private:
int _n;
struct edge {
int to;
};
std::vector<std::pair<int, edge>> edges;
};
} // namespace internal
} // namespace atcoder
namespace atcoder {
struct scc_graph {
public:
scc_graph() : internal(0) {}
explicit scc_graph(int n) : internal(n) {}
void add_edge(int from, int to) {
int n = internal.num_vertices();
assert(0 <= from && from < n);
assert(0 <= to && to < n);
internal.add_edge(from, to);
}
std::vector<std::vector<int>> scc() { return internal.scc(); }
private:
internal::scc_graph internal;
};
} // namespace atcoder
using namespace atcoder;
void solve(){
int N,K,Q;
cin >> N >> K >> Q;
scc_graph scc(N);
vector<vector<int>> V(K, vector<int>(N));
for(int i = 0; i < K; i++){
for(int j = 0; j < N; j++){
cin >> V[i][j];
V[i][j]--;
if(j > 0){
scc.add_edge(V[i][j-1], V[i][j]);
}
}
}
auto ret = scc.scc();
vector<int> rev(N);
for(int i = 0; i < ret.size(); i++){
for(auto v: ret[i]){
rev[v] = i;
}
}
vector<ll> c(ret.size() + 1);
vector<ll> sum(ret.size() + 1);
for(int i = 0; i < ret.size(); i++){
c[i + 1] = c[i] + ret[i].size();
sum[i + 1] = sum[i] + ll(ret[i].size()) * ll(ll(ret[i].size()) - 1) / 2;
}
auto f = [&](int l, int r) -> ll {
if(r < l)return 0;
return sum[r] - sum[l];
};
auto cnt = [&](int l, int r = -2) -> ll {
if(r == -2) r = l + 1;
if(r < l)return 0;
return c[r] - c[l];
};
ll v=0;
while(Q--){
ll id, l, r;
cin >> id >> l >> r;
id += v;
id %= K;
l += v;
l %= N;
r += v;
r %= N;
if(rev[l] == rev[r]){
v = (r - l + 1) * (r - l) / 2;
cout << v << "\n";
}else{
ll C = cnt(0, rev[l]);
ll Cnt = cnt(rev[l]) - (l - C);
v = 0;
v += Cnt * (Cnt - 1) / 2;
C = cnt(0, rev[r]);
Cnt = r - C + 1;
v += Cnt * (Cnt - 1) / 2;
v += f(rev[l], rev[r] + 1 - 1);
cout << v << "\n";
}
}
}
signed main(){
int T;
cin >> T;
while(T--){
solve();
}
}
详细
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 3628kb
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 3
result:
wrong answer 5th lines differ - expected: '2', found: '3'