| 比赛 |
USACO2026 JAN G&P2 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
COW Traversals |
最终得分 |
100 |
| 用户昵称 |
xuyuqing |
运行时间 |
10.499 s |
| 代码语言 |
C++ |
内存使用 |
17.92 MiB |
| 提交时间 |
2026-01-24 10:04:13 |
显示代码纯文本
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <tuple>
#include <utility>
#include <vector>
using namespace std;
const int N = 233233;
int n;
int fri[N];
int m;
int cows[N];
vector<int> ops[N];
int fa[N];
int sz[N];
int res[4];
vector<tuple<int, int, int>> ress;
int color[N];
bool vis[N];
int find (int u) {
if (fa[u] == u) {
return u;
}
fa[u] = find(fa[u]);
color[u] = color[fa[u]];
return fa[u];
}
void merge (int u, int v) {
u = find (u);
v = find (v);
res[color[v]] -= sz[v];
sz[v] += sz[u];
res[color[v]] += sz[v];
fa[u] = v;
}
void dfs (int u) {
if (vis[u] || color[u]) {
return;
}
vis[u] = true;
int v = fri[u];
dfs (find (v));
merge (u, v);
}
int main () {
freopen ("COW.in", "r", stdin);
freopen ("COW.out", "w", stdout);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> fri[i];
}
cin >> m;
for (int i = 1; i <= m; i++) {
char t;
cin >> cows[i] >> t;
int ty;
if (t == 'C') {
ty = 1;
}
if (t == 'O') {
ty = 2;
}
if (t == 'W') {
ty = 3;
}
ops[cows[i]].push_back(ty);
color[cows[i]] = ty;
}
for (int i = 1; i <= n; i++) {
fa[i] = i;
sz[i] = 1;
if (color[i]) {
res[color[i]]++;
}
}
for (int i = 1; i <= n; i++) {
dfs (i);
}
for (int i = m; i >= 1; i--) {
ress.emplace_back(res[1], res[2], res[3]);
if (ops[cows[i]].size() != 1) {
res[ops[cows[i]].back()] -= sz[cows[i]];
ops[cows[i]].pop_back();
res[ops[cows[i]].back()] += sz[cows[i]];
color[cows[i]] = ops[cows[i]].back();
}
else {
res[ops[cows[i]].back()] -= sz[cows[i]];
color[cows[i]] = vis[cows[i]] = 0;
dfs (cows[i]);
}
}
for (auto it = ress.rbegin(); it != ress.rend(); it++) {
auto [r1, r2, r3] = *it;
cout << r1 << ' ' << r2 << ' ' << r3 << endl;
}
return 0;
}