样例没过求调
查看原帖
样例没过求调
1121518
StarsIntoSea楼主2024/8/10 16:52
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
const int N=1e5+2;
vector<int> e[N];
int fa[N],son[N],dep[N],siz[N],tops[N],root[N],ans[N];
int ls[N*50],rs[N*50],s[N*50],typ[N*50];
int n,m,idx=0;
void dfs1(int x,int f){
	dep[x]=dep[f]+1;
	fa[x]=f;
	siz[x]=1;
	int maxson=-1;
	for(auto y:e[x]){
		if(y==f) continue;
		dfs1(y,x);
		siz[x]+=siz[y];
		if(maxson<siz[y]) maxson=siz[y],son[x]=y;
	}
}
void dfs2(int x,int top){
	tops[x]=top;
	if(!son[x]) return;
	dfs2(son[x],top);
	for(auto y:e[x]){
		if(y==fa[x]||y==son[x]) continue;
		dfs2(y,y);
	}
}
int lca(int x,int y){
	while(tops[x]!=tops[y]){
		if(dep[tops[x]]<=dep[tops[y]]) swap(x,y);
		x=fa[tops[x]];
	}
	return dep[x]<=dep[y]?x:y;
}
void pushup(int p){
	if(s[ls[p]]>=s[rs[p]]) 
		s[p]=s[ls[p]],typ[p]=typ[ls[p]];
	else  s[p]=s[rs[p]],typ[p]=typ[rs[p]];
}
void update(int &p,int x,int y,int u,int t){
	if(!p) p=++idx;
	if(x==y){s[p]+=t;typ[p]=u;return ;}
	int mid=(x+y)>>1;
	if(u<=mid) update(ls[p],x,mid,u,t);
	else update(rs[p],mid+1,y,u,t);
	pushup(p);
}
int merge(int x,int y,int l,int r){
	if(!x || !y) return x|y;
	if(l==r){s[x]+=s[y];return x;}
	int mid=(l+r)>>1;
	ls[x]=merge(ls[x],ls[y],l,mid);
	rs[x]=merge(rs[x],rs[y],mid+1,r);
	pushup(x);
	return x;
}
void dfs(int x){
	for(auto y:e[x]){
		if(y==fa[x]) continue;
		dfs(y);
		root[x]=merge(root[x],root[y],1,N);
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<n;++i){
		int u,v;
		scanf("%d%d",&u,&v);
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs1(1,0);
	dfs2(1,1);
	while(m--){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		update(root[x],1,N,z,1);
		update(root[y],1,N,z,1);
		int t=lca(x,y);
		printf("%d\n",t);
		update(root[t],1,N,z,-1);
		update(root[fa[t]],1,N,z,-1);
	}
	for(int i=1;i<=n;++i) printf("%d\n",s[root[i]]>0?typ[root[i]]:0);
}
2024/8/10 16:52
加载中...