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