萌新RE求助
查看原帖
萌新RE求助
341034
abcde777楼主2021/1/16 12:07
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#define maxa 100000
using namespace std ;

const int N = 1001000 ;
const int P = 1000100 ;
struct node {
	int lson,rson ;
	int val ;
	int num ;
	int ans ;
}a[N<<3] ;
int rt[P] ;
int n,m,cnt ;
int f[P][22],dep[P],fi[P] ;
bool vis[P] ;
vector<int> fq[P] ,rq[P] ;

inline int read() {
	int ret = 0 ; char ch ;
	while((ch=getchar())>'9'||ch<'0') ;	ret = ch-'0' ;
	while((ch=getchar())>='0'&&ch<='9') ret = ret*10+ch-'0' ;
	return ret ;
}
void dfs1(int x) {
	vis[x] = 1 ;
	for(int i=0;i<fq[x].size() ;++i) {
		int c = fq[x][i] ;
		if(!vis[c]) rq[x].push_back(c),dfs1(c) ; 
	}
}
int deal(int x,int fa) {
	dep[x] = dep[fa]+1 ; f[x][0] = fa ;
	for(int i=0;i<20;++i) f[x][i+1] = f[f[x][i]][i] ;
	for(int i=0;i<rq[x].size() ;++i) deal(rq[x][i],x) ;
}
int lca(int x,int y) {
	if(dep[x]>dep[y]) swap(x,y) ;
	for(int i=20;i>=0;--i) {
		if(dep[f[y][i]]>=dep[x]) y=f[y][i] ;
		if(x==y) return y ;
	}
	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(a[a[k].lson ].ans >=a[a[k].rson ].ans ) a[k].ans = a[a[k].lson ].ans , a[k].num = a[a[k].lson ].num ;
	else a[k].ans = a[a[k].rson ].ans , a[k].num = a[a[k].rson ].num ;
}
int change(int &k,int val,int pls,int l,int r) {
	if(!k) 	{
		cnt++ ;
		k = cnt ;
	}
	if(l ==r ) {
		a[k].num = l ; 
		a[k].ans +=pls ;
		return k ;
	}
	int mid = l+r>>1 ;
	if(mid>=val) change(a[k].lson ,val,pls,l,mid) ;
	else change(a[k].rson ,val,pls,mid+1,r) ;
	pushup(k) ;
	return k ;
}
int merge(int x,int y,int l,int r) {
	if(!x) return y ;
	if(!y) return x ;
	if(l==r) {
		a[x].num = l ;
		a[x].ans = a[x].ans +a[y].ans ;
		return x ;
	}
	int mid = l+r>>1 ;
	a[x].lson = merge(a[x].lson ,a[y].lson ,l,mid) ;
	a[x].rson = merge(a[x].rson ,a[y].rson ,mid+1,r) ;
	pushup(x) ;	return x ;
}
void dfs2(int x) {
	for(int i=0;i<rq[x].size() ;++i) {
		int c = rq[x][i] ;
		dfs2(c) ; rt[x] = merge(x,c,1,maxa) ;
	}
	if(a[rt[x]].ans ) fi[x] = a[rt[x]].num ;
}
void init() {
	n = read() ; m = read() ;
	for(int i=1;i<=n;++i) rt[i] = ++cnt ;
	for(int i=1;i<n;++i) {
		int x,y ;
		x = read() ; y = read() ;
		fq[x].push_back(y) ;
		fq[y].push_back(x) ;  
	}
	dfs1(1) ; deal(1,0) ;
	for(int i=1;i<=m;++i) {
		int x,y,z,l ;
		x = read() ; y = read() ; z = read() ;
		l = lca(x,y) ;	
		rt[x] = change(rt[x],z,1,1,maxa) ;
		rt[y] = change(rt[y],z,1,1,maxa) ;
		rt[l] = change(rt[l],z,-1,1,maxa) ;
		if(f[l][0]) rt[f[l][0]] = change(rt[f[l][0]],z,-1,1,maxa) ;
	}
}
void Print_nnq() { for(int i=1;i<=n;++i) cout<<fi[i]<<endl ; }
int main()
{
	init() ;
	dfs2(1) ;
	Print_nnq() ;
}
2021/1/16 12:07
加载中...