比赛 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;
}