RE 65pts 求调,玄关
查看原帖
RE 65pts 求调,玄关
408557
Xuan_qwq楼主2025/1/2 16:50

rt,提交记录

#include<bits/stdc++.h>
using namespace std;
int n,m,a[2000005],siz[2000005],fa[2000005],g[2000005];
//vector<int>G[2000005];
map<int,list<int>>C[2000005];
int find(int x) {
	if(x==fa[x])return x;
	return fa[x]=find(fa[x]);
}
void merge(int x,int y){
	x=find(x),y=find(y);
	fa[y]=x;
	siz[x]+=siz[y];
}
//void dfs(int u,int ff){
//	for(int i=0;i<G[u].size();i++){
//		int v=G[u][i];
//		if(v==ff)continue;
//		g[v]=u; 
//        if (a[v]==a[u])merge(u,v);
//        else C[find(u)][a[v]].push_back(v);
//        dfs(v,u);
//	}
//}
void mg(int x,int y){
    if (C[x].size()<C[y].size())swap(C[x],C[y]);
    for (auto i:C[y])C[x][i.first].splice(C[x][i.first].end(),i.second);
    C[y].clear();
}
int main(){
	cin>>n>>m;
	for(int i=2;i<=n;i++)cin>>g[i];
	for(int i=1;i<=n;i++){
		cin>>a[i];
		siz[i]=1,fa[i]=i;
	}
	for(int i=2;i<=n;i++){
		if(a[i]==a[g[i]])merge(g[i],i);
		else C[find(g[i])][a[i]].push_back(i);
	}
	while(m--){
		int op,x;cin>>op>>x;
		x=find(x);
		if(op==1){
			int y;cin>>y;
			if(a[x]==y) continue;
			for(int i:C[x][y]) if(y==a[i]&&x!=find(i))merge(x,i),mg(x,i);
			int z=find(g[x]);
			if(a[z]==y)merge(z,x),mg(z,x);
			else if(z) C[z][y].push_back(x);
			a[find(x)]=y;
			C[find(x)][y].clear();
		}
		else cout<<siz[x]<<endl;
	}	
	return 0;
}

验证码 wccb 祭

2025/1/2 16:50
加载中...