萌新求助 dsu on tree
  • 板块学术版
  • 楼主hytallenxu
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/23 17:05
  • 上次更新2024/8/23 18:06:16
查看原帖
萌新求助 dsu on tree
726098
hytallenxu楼主2024/8/23 17:05

RT,有没有知道以下两种代码的区别在哪里

#include <bits/stdc++.h>
#define mp make_pair
#define pb emplace_back
#define endl "\n"
using namespace std;
using ll = long long;
int n,t,cnt=0,totCol=0;
const int maxn=2e5+10;
int head[maxn];
struct{int from,to,next;}edge[maxn];
inline void add(int u, int v){
	edge[cnt].from=u;edge[cnt].to=v;edge[cnt].next=head[u];
    head[u]=cnt++;
}
inline void init(){for(int i=1;i<=n;i++)edge[i].next=head[i]=-1;}
int siz[maxn],big[maxn];
int L[maxn],R[maxn],Node[maxn],cmt[maxn],arr[maxn],ans[maxn];
void dfs1(int u, int from){
	L[u]=++cnt;
	Node[cnt]=u;
	siz[u]=1;
	int ma=0;
	for(int i=head[u];~i;i=edge[i].next){
		int v=edge[i].to;
		if(v!=from){
			dfs1(v,u);
			siz[u]+=siz[v];
			if(siz[v]>ma){
				big[u]=v;
				ma=siz[v];
			}
		}
	}
	R[u]=cnt;
}

void dfs2(int u, int from, bool keep){
	for(int i=head[u];~i;i=edge[i].next){
		int v=edge[i].to;
		if(v!=from && v!=big[u]){
			dfs2(v,u,0);
		}
	}
	if(big[u]){
		dfs2(big[u],u,1);
	}
	for(int i=head[u];~i;i=edge[i].next){
		int v=edge[i].to;
		if(v!=from && v!=big[u]){
			for(int i=L[v];i<=R[v];i++){
				if(cmt[arr[Node[i]]]==0) ++totCol;
				cmt[arr[Node[i]]]++;
			}
		}
	}
	if(cmt[arr[u]]==0) ++totCol;
	cmt[arr[u]]++;
	ans[u]=totCol;
	
	if(!keep){
		for(int i=L[u];i<=R[u];i++){
			cmt[arr[Node[i]]]--;
			if(cmt[arr[Node[i]]]==0) --totCol;
		}
	}
}
signed main(){
	cin.tie(nullptr)->sync_with_stdio(0);
	cin>>n;
	init();
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		add(u,v);add(v,u);
	}
	for(int i=1;i<=n;i++){
		cin>>arr[i];
	}
	dfs1(1,0);
	dfs2(1,0,0);
	for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
	return 0;
}
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int color[100010];
int h[100010],e[200010],ne[200010],idx;
void add(int a,int b){
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int f[100010];
int son[100010];
int big[100010];
int l[100010],r[100010],p[100010],times;
void dfs(int u,int fa){
	son[u]=1;
	l[u]=++times;
	p[times]=u;
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(j==fa) continue;
		dfs(j,u);
		son[u]+=son[j];
		if(son[big[u]]<son[j]) big[u]=j;
	}
	r[u]=times;
}
int sum;
int cnt[100010];
void add(int u){
	if(++cnt[color[u]]==1) sum++;
}
void dfs2(int u,int fa,bool keep){
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(j==fa || big[u]==j) continue;
		dfs2(j,u,false);
	}
	if(big[u]) dfs2(big[u],u,true);
	add(u);
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(j==fa || big[u]==j) continue;
		for(int k=l[j];k<=r[j];k++) add(p[k]);
	}
	f[u]=sum;
	if(!keep){
		sum=0;
		for(int i=l[u];i<=r[u];i++) cnt[color[p[i]]]=0;
	}
}
int main(){
	int n;
	scanf("%d",&n);
	memset(h,-1,sizeof h);
	for(int i=1;i<n;i++){
		int a,b;
		scanf("%d %d",&a,&b);
		add(a,b),add(b,a); 
	}
	for(int i=1;i<=n;i++) scanf("%d",&color[i]);
	dfs(1,1);
	dfs2(1,1,false);
	for(int i=1;i<=n;i++) printf("%d\n",f[i]);
	return 0;
}

题目:U464326

用代码 11 造了数据放到代码 22 跑,喜提 WA,求解释。

同时求学习 dsu on tree 较好的大神笔记。

2024/8/23 17:05
加载中...