求助:不能过样例
查看原帖
求助:不能过样例
593595
_Aurore_楼主2023/1/13 19:30
#include<bits/stdc++.h>
#define int long long
#define MAXN 100001
#define inf 100000
using namespace std;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')
			f=-f;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
int n,m,cnt,ans[MAXN];
struct node{
	int dep,dad,siz,maxson;
	int id,top;
}a[MAXN];
vector<int> e[MAXN];
void dfs1(int x,int dad,int dep){
	a[x].dep=dep;
	a[x].dad=dad;
	a[x].siz=1;
	int mx=-MAXN;
	for(int i=0;i<e[x].size();i++)
	    if(e[x][i]!=dad){
	    	dfs1(e[x][i],x,dep+1);
	    	a[x].siz+=a[e[x][i]].siz;
	    	if(a[e[x][i]].siz>mx){
	    		mx=a[e[x][i]].siz;
	    		a[x].maxson=e[x][i];
			}
		}
}
void dfs2(int x,int top){
	a[x].id=++cnt;
	a[x].top=top;
	if(!a[x].maxson)
	    return ;
	dfs2(a[x].maxson,top);
	for(int i=0;i<e[x].size();i++)
	    if(e[x][i]!=a[x].maxson&&e[x][i]!=a[x].dad)
	        dfs2(e[x][i],e[x][i]);
}
int lca(int u,int v){
	while(a[u].top!=a[v].top){
		if(a[a[u].top].dep<a[a[v].top].dep)
		    swap(u,v);
		u=a[a[u].top].dad;
	}
	if(a[u].dep<a[v].dep)
	    return u;
	return v;
}
int rot[MAXN],tot;
struct seg_tree{
	int mx;
	int l,r,id; 
}t[MAXN*40];
void addtag(int &i){
	if(!i){
		i=++tot;
		t[i].mx=0;
	}
}
void pushup(int i){
	t[i].mx=max(t[t[i].l].mx,t[t[i].r].mx);
	int ls=t[i].l,rs=t[i].r;
	if(t[ls].mx>=t[rs].mx)
		t[i].id=t[ls].id;
	else
		t[i].id=t[rs].id;
}
void pushdown(int i){
	addtag(t[i].l);
	addtag(t[i].r);
}
void update(int i,int l,int r,int L,int R,int k){
	if(l>R||r<L)
		return ;
	if(L<=l&&r<=R){
		addtag(i);
		t[i].id=l;
		t[i].mx+=k;
		return ;
	}
	pushdown(i);
	int mid=(l+r-1)/2;
	update(t[i].l,l,mid,L,R,k);
	update(t[i].r,mid+1,r,L,R,k);
	pushup(i);
}
int merge(int x1,int x2,int l,int r){
	if(!x1)
		return x2;
	if(!x2)
		return x1;
	if(l==r){
		t[x1].mx+=t[x2].mx;
		t[x1].id=l;
		return x1;
	}
	int mid=(l+r-1)/2;
	merge(t[x1].l,t[x2].l,l,mid);
	merge(t[x1].r,t[x2].r,mid+1,r);
	pushup(x1);
	return x1;
}
void dfs3(int x,int dad){
	for(int i=0;i<e[x].size();i++){
		int to=e[x][i];
		if(to!=dad){
			dfs3(to,x);
			rot[x]=merge(rot[x],rot[to],0,inf);
		}
	}
	if(t[rot[x]].mx)
		ans[x]=t[rot[x]].id;
}
signed main(){
	n=read(),m=read();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs1(1,-1,0);
	dfs2(1,1);
	for(int i=1;i<=n;i++)
		rot[i]=++tot;
	for(int i=1;i<=m;i++){
		int u=read(),v=read(),z=read();
		update(rot[u],0,inf,z,z,1);
		update(rot[v],0,inf,z,z,1);
		int x=lca(u,v);
		update(rot[x],0,inf,z,z,-1);
		if(a[x].dad!=-1)
			update(rot[a[x].dad],0,inf,z,z,-1);
	}	
	//for(int i=1;i<=n;i++)
//		for(int j=1;j<=10;j++)
	//		update(rot[i],0,inf,j,j,0); 
//	for(int i=1;i<=n;i++)
//		cout<< 
	//for(int i=1;i<=n;i++)
	//	cout<<t[rot[i]].id<<endl;
	dfs3(1,-1);
	for(int i=1;i<=n;i++)
		cout<<ans[i]<<endl;
	return 0;
}

2023/1/13 19:30
加载中...