30分,WA1-7,求助
查看原帖
30分,WA1-7,求助
754444
tamamocross楼主2023/9/19 19:48
#include<iostream>
using namespace std;
const int Max=200001;
int tot,Next[Max],ver[Max],Head[Max],color[Max],cnt[Max],hson[Max],sz[Max],cnt1[Max],ans,cl,n;
void add(int x,int y){                                    
	ver[++tot]=y;
	Next[tot]=Head[x];Head[x]=tot;	
}
void dfs1(int x){
	sz[x]++;
	for(int i=Head[x];i;i=Next[i]){
		int y=ver[i];
		dfs1(y);
		if(sz[y]>sz[hson[x]]){
			hson[x]=y;	
		}
		sz[x]+=sz[y];
	}		
}
void del(int x){
	int y=color[x];
	cnt1[cnt[y]]--;cnt[y]--;
	
	if(!cnt[y]){
		cl--;
	}
	cnt1[cnt[y]]++;
	for(int i=Head[x];i;i=Next[i]){
		del(ver[i]);
	}
}   
void add1(int x){	
	if(!cnt[color[x]]){
		cl++;	
	}
	cnt1[cnt[color[x]]]--;cnt[color[x]]++;cnt1[cnt[color[x]]]++; 
	for(int i=Head[x];i;i=Next[i]){
		int y=ver[i];
		if(y!=hson[x]){
			add1(y);		
		}
	}	
}
void dfs2(int x,int opt){	
	for(int i=Head[x];i;i=Next[i]){
		int y=ver[i];
		if(y!=hson[x]){
			dfs2(y,0);	
		}
	}	
	if(hson[x]){
		dfs2(hson[x],1);
	}   
	add1(x);
	if(cnt1[cnt[color[x]]]==cl){
		ans++;
	//	cout<<x<<" "<<cl<<endl;
	}

	if(!opt){
		del(x);
	} 
}
int main(){
	cin>>n;
	int x;
	cin>>color[1]>>x;
	for(int i=2;i<=n;i++){
		cin>>color[i]>>x;
		add(x,i);
	}
	dfs1(1);
	dfs2(1,1);
	cout<<ans;
} 

我用启发式合并写的,但只得了30分。

2023/9/19 19:48
加载中...