蒟蒻80pts求助
查看原帖
蒟蒻80pts求助
238861
xzzduang楼主2021/1/16 09:21

WA掉了4个点,都不是特别大的点

调了一晚上了

#include<iostream>
#include<stdio.h>
#define N 200005
#define int long long
using namespace std;
struct edge{
	int b,n;
}e[2*N];
struct segment_tree{
	int lc,rc,sum,mx;
}d[N*30];
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return x*f;
}
int n,m,h[N],tot,x,y,root[N],pool,z,f[N][21],dep[N],ans[N];
void charu(int a,int b){
	e[++tot].b=b,e[tot].n=h[a],h[a]=tot;
}
void Deal_first(int u,int fa){
	for(int i=1;i<=20;++i) f[u][i]=f[f[u][i-1]][i-1];
	for(int i=h[u];i;i=e[i].n){
		int v=e[i].b;
		if(v==fa) continue;
		dep[v]=dep[u]+1;
		f[v][0]=u;
		Deal_first(v,u);
	}
}
int LCA(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=20;i>=0;--i){
		if(dep[f[x][i]]>=dep[y]) x=f[x][i];
	}
	if(x==y) return x;
	for(int i=20;i>=0;--i){
		if(f[x][i]!=f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
void pushup(int k){
	if(!d[k].lc || !d[k].rc){
		d[k].sum=d[d[k].lc+d[k].rc].sum;
		d[k].mx=d[d[k].lc+d[k].rc].mx;
		return;
	}
	if(d[d[k].lc].sum>=d[d[k].rc].sum) d[k].mx=d[d[k].lc].mx;
	else d[k].mx=d[d[k].rc].mx;
	d[k].sum=max(d[d[k].lc].sum,d[d[k].rc].sum);
}
void update(int &k,int l,int r,int x,int v){
	if(l>x || r<x) return;
	if(!k) k=++pool;
	if(l==r){
		d[k].sum+=v;
		d[k].mx=l;
		return;
	}
	int mid=l+r>>1;
	update(d[k].lc,l,mid,x,v);
	update(d[k].rc,mid+1,r,x,v);
	pushup(k);
}
int merge(int x,int y,int l,int r){
	if(!x || !y) return x+y;
	if(l==r){
		d[x].sum+=d[y].sum;
		d[x].mx=l;
		return x;
	}
	int mid=l+r>>1;
	d[x].lc=merge(d[x].lc,d[y].lc,l,mid);
	d[x].rc=merge(d[x].rc,d[y].rc,mid+1,r);
	pushup(x);
	return x;
}
int query()
void dfs(int u,int fa){
	for(int i=h[u];i;i=e[i].n){
		int v=e[i].b;
		if(v==fa) continue;
		dfs(v,u);
		root[u]=merge(root[u],root[v],1,1e5);
	}
	if(d[root[u]].sum) ans[u]=d[root[u]].mx;
}
signed main(){
	n=read(),m=read();
	for(int i=1;i<n;++i){
		x=read(),y=read();
		charu(x,y);
		charu(y,x);
	}
	Deal_first(1,0);
	for(int i=1;i<=m;++i){
		x=read(),y=read(),z=read();
		update(root[x],1,1e5,z,1);
		update(root[y],1,1e5,z,1);
		int lca=LCA(x,y);
		update(root[lca],1,1e5,z,-1);
		if(f[lca][0]) update(root[f[lca][0]],1,1e5,z,-1);
	}
	dfs(1,0);
	for(int i=1;i<=n;++i) printf("%lld\n",ans[i]);
	return 0;
}
2021/1/16 09:21
加载中...