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