关于95 WA#2的疑问
查看原帖
关于95 WA#2的疑问
396994
Winston12321_楼主2023/6/30 15:16

这是我后来的满分代码

#include <iostream>
#include <vector> 
using namespace std;
int n,m;
int cnt;
int u,v,z;
vector<int>son[100010];
int tp[100010],sz[100010],h[100010],dp[100010],f[100010],rt[100010],rs[100010];
struct node{
	int lson,rson,mx,res;
}t[6000010];
void pushup(int id)
{
	if(t[t[id].rson].mx>t[t[id].lson].mx) t[id].mx=t[t[id].rson].mx,t[id].res=t[t[id].rson].res;
	else t[id].res=t[t[id].lson].res,t[id].mx=t[t[id].lson].mx;
}
void add(int id,int l,int r,int x,int y)
{
	if(l==r) return t[id].mx+=y,t[id].res=x,void();
	int mid=l+r>>1;
	if(x<=mid)
	{
		if(!t[id].lson) t[id].lson=++cnt;
		add(t[id].lson,l,mid,x,y);
	}
	else
	{
		if(!t[id].rson) t[id].rson=++cnt;
		add(t[id].rson,mid+1,r,x,y);
	}
	pushup(id);
}
int merge(int x,int y)
{
	if(!x || !y) return x|y;
	if(!max(t[x].lson,t[x].rson) && !max(t[y].lson,t[y].rson))
	{
		if(t[x].res==t[y].res) t[x].mx+=t[y].mx;
		else if(t[y].mx>t[x].mx) t[x].res=t[y].res,t[x].mx=t[y].mx;
		return x;
	}
	t[x].lson=merge(t[x].lson,t[y].lson);
	t[x].rson=merge(t[x].rson,t[y].rson);
	pushup(x);
	return x;
}
void dfs1(int now,int fa,int dpt)
{
	dp[now]=dpt;
	sz[now]=1;
	f[now]=fa;
	for(int s:son[now]) if(s!=fa)
	{
		dfs1(s,now,dpt+1);
		sz[now]+=sz[s];
		if(sz[s]>=sz[h[now]]) h[now]=s;
	}
}
void dfs2(int now,int fa,int top)
{
	tp[now]=top;
	if(h[now])
	{
		dfs2(h[now],now,top);
		for(int s:son[now])
			if(s!=fa && s!=h[now])
				dfs2(s,now,s);
	}
}
int lca(int a,int b)
{
	while(tp[a]!=tp[b])
	{
		if(dp[tp[a]]>dp[tp[b]]) a=f[tp[a]];
		else b=f[tp[b]];
	}
	return (dp[a]>dp[b]?b:a);
}
void dfs3(int now,int fa)
{
	for(int s:son[now]) if(s!=fa)
	{
		dfs3(s,now);
		rt[now]=merge(rt[now],rt[s]);
	}
	if(t[rt[now]].mx==0) rs[now]=0;
	else rs[now]=t[rt[now]].res;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<n;++i)
	{
		cin>>u>>v;
		son[u].push_back(v);
		son[v].push_back(u);
	}
	dfs1(1,0,0);
	dfs2(1,0,1);
	for(int i=1;i<=n;++i) rt[i]=i;
	cnt=n;
	for(int i=1;i<=m;++i)
	{
		cin>>u>>v>>z;
		int uu=lca(u,v),vv=f[uu];
		add(rt[u],1,100000,z,1);
		add(rt[v],1,100000,z,1);
		add(rt[uu],1,100000,z,-1);
		if(vv) add(rt[vv],1,100000,z,-1);
	}
	dfs3(1,0);
	for(int i=1;i<=n;++i) cout<<rs[i]<<endl;
	return 0;
}

原来dfs3是这样写的,我觉得全局变量的初值应该是0啊,为什么还需要特判?

void dfs3(int now,int fa)
{
	for(int s:son[now]) if(s!=fa)
	{
		dfs3(s,now);
		rt[now]=merge(rt[now],rt[s]);
	}
	rs[now]=t[rt[now]].res;/////////看这里
}
2023/6/30 15:16
加载中...