比赛 USACO2026 JAN G&P2 评测结果 AAAAAAAAAAAAAAAAAAAAA
题目名称 COW Traversals 最终得分 100
用户昵称 梦那边的美好ME 运行时间 3.231 s
代码语言 C++ 内存使用 20.85 MiB
提交时间 2026-01-24 10:38:08
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long

ll n,m;
vector<ll> o[210000];
ll siz[210000],fa[210000],a[210000];
ll ans[3][210000],id[210000];

ll find(ll x){
    if(fa[x]==x) return x;
    fa[x]=find(fa[x]);
    return fa[x];
}

void merge(ll u,ll v){
    u=find(u),v=find(v);
    if(u==v) return;
    fa[v]=u;
    siz[u]+=siz[v];
}

int main(){
    freopen("COW.in","r",stdin);
    freopen("COW.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        fa[i]=i;
        siz[i]=1;
    }
    cin>>m;
    for(int i=1;i<=m;i++){
        int c;
        char v;
        cin>>c>>v;
        id[i]=c;
        if (v=='C') o[c].push_back(0);
        else if (v=='O') o[c].push_back(1);
        else o[c].push_back(2);
    }
    for(int i=1;i<=n;i++){
        if(!o[i].size()){
            merge(a[i],i);
        }
    }
    for(int i=1;i<=n;i++){
        if(fa[i]==i&&o[i].size()){
            ans[o[i].back()][m]+=siz[i];
        }
    }
    for(int i=m;i>=1;i--){
        ll c=id[i];
        ll rt=find(c);
        for(int o=0;o<3;o++) ans[o][i-1]=ans[o][i];
        if(o[c].size()) ans[o[c].back()][i-1]-=siz[rt],o[c].pop_back();
        if(o[c].size()) ans[o[c].back()][i-1]+=siz[rt];
        else{
            ll f=find(a[c]);
            ll sz=siz[rt];
            merge(f,rt);
            if(o[f].size()) ans[o[f].back()][i-1]+=sz;
        }
    }
    for(int i=1;i<=m;i++){
        for(int o=0;o<3;o++)
            cout<<ans[o][i]<<" ";
        cout<<"\n";
    }
    return 0;
}