QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#741777 | #9731. Fuzzy Ranking | TMM233# | WA | 12ms | 3636kb | C++23 | 3.6kb | 2024-11-13 15:12:51 | 2024-11-13 15:12:51 |
Judging History
answer
#include <bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
const int maxn = 1e6 + 5;
class tarjan {
public :
vector<int> stk;
vector<int> fdn, low, color;
vector<bool> vis;
vector<vector<int>> to;
int cnt = 0, step = 0;
int _n;
void add_edge(int u, int v)
{
to[u].push_back(v);
}
tarjan(int n)
{
_n = n;
fdn.assign(n, 0);
low.assign(n, 0);
color.assign(n, 0);
vis.assign(n, 0);
to.assign(n, vector<int>());
}
void dfs(int x)
{
vis[x] = 1;
fdn[x] = low[x] = ++step;
stk.push_back(x);
for (auto i : to[x])
{
int v = i;
if (!fdn[v])
{
dfs(v);
low[x] = min(low[v], low[x]);
}
else if (vis[v])
{
low[x] = min(low[x], fdn[v]);
}
}
if (fdn[x] == low[x])
{
vis[x] = 0;
color[x] = ++cnt;
int i = stk.size() - 1;
while (stk[i] != x)
{
vis[stk[i]] = 0;
color[stk[i]] = cnt;
stk.pop_back();
i--;
}
stk.pop_back();
}
}
auto work()
{
for (int i = 1; i < _n; i++)
{
if (!fdn[i])
dfs(i);
}
return color;
}
};
void solve() {
int n, k, q; cin >> n >> k >> q;
tarjan tar(n + 1);
vector< vector< int > > a(k + 1, vector< int >(n + 1, 0));
vector< vector< int > > c(k + 1, vector< int >(n + 1, 0));
vector< vector< int > > lst(k + 1, vector< int >(n + 2, 0));
vector< vector< int > > nxt(k + 1, vector< int >(n + 2, 0));
vector< vector< int > > pre(k + 1, vector< int >(n + 2, 0));
for(int i = 1; i <= k; i++) {
for(int j = 1; j <= n; j++) {
cin >> a[i][j];
if(j != 1) {
tar.add_edge(a[i][j - 1], a[i][j]);
}
}
}
vector< int > col = tar.work();
for(int i = 1; i <= k; i++) {
for(int j = 1; j <= n; j++) {
c[i][j] = col[a[i][j]];
}
}
for(int i = 1; i <= k; i++) {
int cur = 0, pc = 0;
for(int j = 1; j <= n; j++) {
if(c[i][j] == c[i][j - 1]) {
nxt[i][j] = nxt[i][j - 1];
cur++;
}
else {
pre[i][j - 1] = pre[i][pc] + cur * (cur - 1) / 2;
nxt[i][j] = j;
cur = 1; pc = j - 1;
}
}
for(int j = n; j >= 1; j--) {
if(c[i][j] == c[i][j + 1]) {
lst[i][j] = lst[i][j + 1];
}
else {
lst[i][j] = j;
}
}
}
int 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;
int l_ = lst[id][l];
if(l_ >= r) {
int len = (r - l + 1);
ans = len * (len - 1) / 2;
}
else {
int r_ = nxt[id][r];
int len1 = (l_ - l + 1);
int len2 = (r - r_ + 1);
ans = len1 * (len1 - 1) / 2 + len2 * (len2 - 1) / 2 + pre[id][r_ - 1] - pre[id][l_];
}
cout << ans << '\n';
}
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0);
int t = 1;
cin >> t;
while (t--)
solve();
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3556kb
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: 12ms
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:
1 1 0 0 3 2 0 2 2 4 1 0 1 1 1 1 2 4 4 3 1 6 28 0 0 10 10 6 6 15 0 3 10 6 16 6 11 1 2 1 1 6 3 3 0 4 5 3 4 1 1 3 2 4 0 3 4 4 4 4 0 0 1 1 2 0 0 1 2 1 1 0 0 1 4 3 0 4 4 1 3 6 16 16 0 11 16 1 4 15 1 4 2 0 0 2 0 1 2 4 0 0 0 0 0 0 0 0 0 0 1 0 0 6 3 0 3 4 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 1 3 1 0 0 3 3 9 1 9 4 ...
result:
wrong answer 177th lines differ - expected: '10', found: '26'