60pts求助qwq
查看原帖
60pts求助qwq
1249322
Elaina_0楼主2024/5/11 17:50

rt

感谢qwq

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+100;
#define int long long
#define inf 0x3f
#define INF 0x3f3f3f3f
#define mst(a,b) memset(a,b,sizeof(a))
#define re register
#define Elaina 0
#define lson tr[rt].ls
#define rson tr[rt].rs
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
    return x*f;
}

int rot[N*2];
int n,m,head[N*2],ct;
int fa[N][21],dep[N];
struct EDGE{
	int nxt,to;
}e[N*2];
void add(int x,int y){
	e[++ct].to=y;
	e[ct].nxt=head[x];
	head[x]=ct;
}


class segtr{
	public:
		int seg=0;
		struct NODE{
			int ls,rs;
			int mx=0;
		}tr[N*100];

		void pushup(int rt){
			tr[rt].mx=max(tr[lson].mx,tr[rson].mx);
		}

		void insert(int &rt,int l,int r,int pos,int val){
			if(!rt) rt=++seg;
			if(l==r){
				tr[rt].mx+=val;
				return;
			}
			int mid=(l+r)>>1;
			if(pos<=mid) insert(lson,l,mid,pos,val);
			else insert(rson,mid+1,r,pos,val);
			pushup(rt);
		}
		
		int query(int rt,int l,int r){
			if(!rt) return 0;
			if(l==r) return tr[rt].mx?l:0;
			int mid=(l+r)>>1;
			if(tr[lson].mx>=tr[rson].mx) return query(lson,l,mid);
			else return query(rson,mid+1,r);
		}
		
		void segmerge(int &rt,int x,int y,int l,int r){
			if(!x||!y){
				rt=x+y;
				return;
			}
			rt=++seg;
			if(l==r){
				tr[rt].mx=tr[x].mx+tr[y].mx;
				return;
			}
			int mid=(l+r)>>1;
			lson=tr[x].ls;
			rson=tr[x].rs;
			segmerge(lson,tr[x].ls,tr[y].ls,l,mid);
			segmerge(rson,tr[x].rs,tr[y].rs,mid+1,r);
			pushup(rt);
			return;
		}
		
};

segtr damn;

void dfs1(int x,int f){
	dep[x]=dep[f]+1;
	fa[x][0]=f;
	for(int i=1;i<=20;++i){
		fa[x][i]=fa[fa[x][i-1]][i-1];
	}
	for(int i=head[x];~i;i=e[i].nxt){
		if(e[i].to==f){
			continue;
		}
		dfs1(e[i].to,x);
	}
}

int lca(int a,int b){
	if(dep[a]<dep[b]) swap(a,b);
	
	for(int i=20;i>=0;--i){
		if(dep[fa[a][i]]>=dep[b]){
			a=fa[a][i];
		}
	}
	if(a==b){
		return a;
	}
	for(int i=20;i>=0;--i){
		if(fa[a][i]!=fa[b][i]){
			a=fa[a][i],b=fa[b][i];
		}
	}
	return fa[a][0];
}

void dfs2(int x){
	for(int i=head[x];~i;i=e[i].nxt){
		if(e[i].to==fa[x][0]){
			continue;
		}
		dfs2(e[i].to);
		damn.segmerge(rot[x],rot[x],rot[e[i].to],1,100000);
	}
}



main(){
	mst(head,-1);
	n=read(),m=read();
	for(int i=1;i<n;++i){
		int x=read(),y=read();
		add(x,y),add(y,x);
	}
	dep[0]=0,dep[1]=1;
	dfs1(1,0);
	while(--m){
		int x=read(),y=read(),z=read();
		int p=lca(x,y);
		damn.insert(rot[x],1,100000,z,1);
		damn.insert(rot[y],1,100000,z,1);
		damn.insert(rot[p],1,100000,z,-1);
		if(fa[p][0]) damn.insert(rot[fa[p][0]],1,100000,z,-1);
	}
	dfs2(1);
	for(int i=1;i<=n;++i) printf("%lld\n",damn.query(rot[i],1,100000));
	return Elaina;
}

/*
20 50
8 6
10 6
18 6
20 10
7 20
2 18
19 8
1 6
14 20
16 10
13 19
3 14
17 18
11 19
4 11
15 14
5 18
9 10
12 15
11 14 87
12 1 87
14 3 84
17 2 36
6 5 93
17 6 87
10 14 93
5 16 78
6 15 93
15 5 16
11 8 50
17 19 50
5 4 87
15 20 78
1 17 50
20 13 87
7 15 22
16 11 94
19 8 87
18 3 93
13 13 87
2 1 87
2 6 22
5 20 84
10 12 93
18 12 87
16 10 93
8 17 93
14 7 36
7 4 22
5 9 87
13 10 16
20 11 50
9 16 84
10 17 16
19 6 87
12 2 36
20 9 94
9 2 84
14 1 94
5 5 94
8 17 16
12 8 36
20 17 78
12 18 50
16 8 94
2 19 36
10 18 36
14 19 50
4 12 50
*/
2024/5/11 17:50
加载中...