倍增lca+线段树合并求调 WA 15pts
查看原帖
倍增lca+线段树合并求调 WA 15pts
448555
推翻暴政楼主2023/10/11 09:05

rt 感谢

#include<bits/stdc++.h>
#define MAXN 200005
using namespace std;
int n,m,t,head[MAXN],tot,f[MAXN][30],cnt,d[MAXN],ans[MAXN],root[MAXN];
struct edge{
	int v,nex;
} e[MAXN<<1];
struct sgtree{
	int lson,rson,maxx,maxc; 
} tr[MAXN<<5];
inline void add_edge(int u,int v){
	e[++tot].v=v;
	e[tot].nex=head[u];
	head[u]=tot;
}
inline void dfs(int x,int fa){
	f[x][0]=fa;
	d[x]=d[fa]+1;
	for(int i=1;i<=t;i++){
		f[x][i]=f[f[x][i-1]][i-1];
	}
	for(int i=head[x];i;i=e[i].nex){
		int y=e[i].v;
		if(y==fa)  continue;
		dfs(y,x);
	}
}
inline int query(int x,int y){
	if(d[x]>d[y])  swap(x,y);
	for(int i=t;i>=0;i--){
		if(d[f[y][i]]>=d[x])  y=f[y][i];
	}
	if(x==y)  return x;
	for(int i=t;i>=0;i--){
		if(d[f[y][i]]!=d[f[x][i]]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
inline int build(){
	cnt++;
	return cnt;
}
inline void update(int p){
	tr[p].maxx=0;tr[p].maxc=0;
	if(tr[p].lson){
		if(tr[tr[p].lson].maxx>tr[p].maxx){
			tr[p].maxx=tr[tr[p].lson].maxx;
			tr[p].maxc=tr[tr[p].lson].maxc;
		}
		if(tr[tr[p].lson].maxx==tr[p].maxx){
			tr[p].maxc=min(tr[p].maxc,tr[tr[p].lson].maxc);
		}
	}
	if(tr[p].rson){
		if(tr[tr[p].rson].maxx>tr[p].maxx){
			tr[p].maxx=tr[tr[p].rson].maxx;
			tr[p].maxc=tr[tr[p].rson].maxc;
		}
		if(tr[tr[p].rson].maxx==tr[p].maxx){
			tr[p].maxc=min(tr[p].maxc,tr[tr[p].rson].maxc);
		}
	}
}
inline void modify(int p,int l,int r,int val,int typ){
	if(l==r){
		tr[p].maxx+=typ;
		tr[p].maxc=val;
		return;
	}
	int mid=(l+r)>>1;
	if(val<=mid){
		if(!tr[p].lson)  tr[p].lson=build();
		modify(tr[p].lson,l,mid,val,typ);
	}
	else{
		if(!tr[p].rson)  tr[p].rson=build();
		modify(tr[p].rson,mid+1,r,val,typ);
	}
	update(p);
	return;
}
inline int merg(int pl,int pr,int l,int r){
	if(!pl||!pr)  return pl|pr;
	if(l==r){
		tr[pl].maxx+=tr[pr].maxx;
		return pl;
	}
	int mid=(l+r)>>1;
	tr[pl].lson=merg(tr[pl].lson,tr[pr].lson,l,mid);
	tr[pl].rson=merg(tr[pl].rson,tr[pr].rson,mid+1,r);
	update(pl);
	return pl;
}
inline void solve(int x,int fa){
	for(int i=head[x];i;i=e[i].nex){
		int y=e[i].v;
		if(y==fa)  continue;
		solve(y,x);
		root[x]=merg(root[x],root[y],1,n); 
	}
	ans[x]=tr[root[x]].maxc;
}
int main(){
//	freopen("P4556_3.in","r",stdin);
//	freopen("P4556_3.txt","w",stdout);
	scanf("%d%d",&n,&m);
	t=log(n)/log(2)+1;
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		add_edge(x,y);
		add_edge(y,x);
	}
	dfs(1,0);
	for(int i=1;i<=n;i++){
		root[i]=build();
	} 
	for(int i=1;i<=m;i++){
		int x,y,z,lca;
		scanf("%d%d%d",&x,&y,&z);
		lca=query(x,y);
		modify(root[x],1,n,z,1);
		modify(root[y],1,n,z,1);
		modify(root[lca],1,n,z,-1);
		if(lca!=1)  modify(root[f[lca][0]],1,n,z,-1);
	}
	solve(1,0);
	for(int i=1;i<=n;i++){
		printf("%d\n",ans[i]);
	}
	return 0;
} 
2023/10/11 09:05
加载中...