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