比赛 USACO2026 JAN G&P2 评测结果 AAAAAAAAAAAAAAAAAAAAA
题目名称 COW Traversals 最终得分 100
用户昵称 汐汐很希希 运行时间 5.237 s
代码语言 C++ 内存使用 17.21 MiB
提交时间 2026-01-24 09:35:36
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+10;
const int M=2e5+10;
const int MOD=1e9+7;
const int MAXX=2e9;
int n,m,a[N],c[M],ans[150],f[N],sz[N],vis[N];
char s[M],typ[M];
vector<char> op[M];
struct Node{
	int a1,a2,a3;
};
int find(int x){
    if(f[x]==x) return x;
    f[x]=find(f[x]);
    typ[x]=typ[f[x]];
    return f[x];
}
void merge(int x,int y){
    int fx=find(x),fy=find(y);
    ans[typ[fy]]-=sz[fy];
    sz[fy]+=sz[fx];
    ans[typ[fy]]+=sz[fy];
    f[fx]=fy;
    return;
}
void dfs(int x){
    if(typ[x]||vis[x]) return;
    vis[x]=1;
    int nxt=a[x];
    dfs(find(nxt));
    merge(x,nxt);
    return;
}
int main()
{
    freopen("COW.in","r",stdin);
    freopen("COW.out","w",stdout);
    
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>c[i]>>s[i];
		op[c[i]].push_back(s[i]);
	}
	for(int i=1;i<=n;i++){
		f[i]=i;
		sz[i]=1;
		if(op[i].size()){
			typ[i]=op[i].back();
			ans[typ[i]]++;
		}
	}
	for(int i=1;i<=n;i++) dfs(i);
	vector<Node> sol;
	for(int i=m;i>=1;i--){
		sol.push_back({ans['C'],ans['O'],ans['W']});
        if(op[c[i]].size()==1){
            ans[op[c[i]].back()]-=sz[c[i]];
            typ[c[i]]=vis[c[i]]=0;
            dfs(c[i]);
        }else{
            ans[op[c[i]].back()]-=sz[c[i]];
            op[c[i]].pop_back();
            ans[op[c[i]].back()]+=sz[c[i]];
            typ[c[i]]=op[c[i]].back();
        }
	}
	reverse(sol.begin(),sol.end());
	for(int i=0;i<m;i++){
        cout<<sol[i].a1<<" "<<sol[i].a2<< " " <<sol[i].a3<< "\n";
    }
	return 0;
}