| 比赛 |
USACO2026 JAN G&P2 |
评测结果 |
AAAATTTTTTTTTTTTTTTTT |
| 题目名称 |
COW Traversals |
最终得分 |
16 |
| 用户昵称 |
LikableP |
运行时间 |
19.046 s |
| 代码语言 |
C++ |
内存使用 |
8.26 MiB |
| 提交时间 |
2026-01-24 09:20:54 |
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <ctime>
const int MAXN = 2e5 + 10;
const int MAXM = 2e5 + 10;
struct EDGE {
int v, next;
} edge[MAXN];
int head[MAXN], edgeNum;
void AddEdge(int u, int v) {
edge[++edgeNum] = {v, head[u]};
head[u] = edgeNum;
}
int n, m;
int attending[MAXN], hosting[MAXN];
int partyCount[128];
int vis[MAXN];
void dfs(int u, char type) {
partyCount[attending[u]]--;
partyCount[attending[u] = type]++;
for (int i = head[u]; i; i = edge[i].next) {
int v = edge[i].v;
if (vis[v] || hosting[v]) continue;
dfs(v, type);
}
}
int main() {
#ifdef LOCAL
freopen("!input.in", "r", stdin);
freopen("!output.out", "w", stdout);
#else
freopen("COW.in", "r", stdin);
freopen("COW.out", "w", stdout);
#endif
scanf("%d", &n);
for (int i = 1, like; i <= n; ++i) {
scanf("%d", &like);
AddEdge(like, i);
}
scanf("%d", &m);
for (int i = 1; i <= m; ++i) { int host; char type;
scanf("%d %c", &host, &type);
hosting[host] = 1;
memset(vis, 0, sizeof(vis));
dfs(host, type);
printf("%d %d %d\n", partyCount['C'], partyCount['O'], partyCount['W']);
}
return 0;
}