20pts WA 求助
查看原帖
20pts WA 求助
602803
_qingshu_楼主2024/6/26 19:15

写的比较烂,加了快读在时限内。

#include<bits/stdc++.h>
using namespace std;
int n,m,tot,rt[5200010],f[100010][100],Dep[5200010],ans[5200010];
int u,v,z;
vector<int>e[5200010];
struct edge{
	int lef,rig,lefson,rigson;
	int Max,Maxid;
}tr[10200010];
inline void dfs(int id,int fa){
	Dep[id]=Dep[fa]+1;f[id][0]=fa;
	for(int i=1;i<=log(Dep[id]);i++)f[id][i]=f[f[id][i-1]][i-1];
	for(auto v : e[id])if(v!=fa)dfs(v,id);
}
inline void update(int id){
	if(tr[id].lefson==-1){
		tr[id].Max=tr[tr[id].rigson].Max;
		tr[id].Maxid=tr[tr[id].rigson].Maxid;
	}
	else if(tr[id].rigson==-1){
		tr[id].Max=tr[tr[id].lefson].Max;
		tr[id].Maxid=tr[tr[id].lefson].Maxid;
	}
	else{
		if(tr[tr[id].lefson].Max>=tr[tr[id].rigson].Max){
			tr[id].Max=tr[tr[id].lefson].Max;
			tr[id].Maxid=tr[tr[id].lefson].Maxid;
		}
		else{
			tr[id].Max=tr[tr[id].rigson].Max;
			tr[id].Maxid=tr[tr[id].rigson].Maxid;
		}
	}
}
inline void modify(int id,int fixid,int fixnum){
	if(tr[id].lef==tr[id].rig){tr[id].Max+=fixnum;return;}
	int mid=tr[id].lef+tr[id].rig>>1;
	if(fixid<=mid){
		if(tr[id].lefson==-1){
			tr[id].lefson=++tot;
			tr[tot].lef=tr[id].lef;
			tr[tot].rig=mid;
			tr[tot].lefson=tr[tot].rigson=-1;
			tr[tot].Max=0;tr[tot].Maxid=tr[id].lef;
		}
		modify(tr[id].lefson,fixid,fixnum);
		update(id);
	}
	else{
		if(tr[id].rigson==-1){
			tr[id].rigson=++tot;
			tr[tot].rig=tr[id].rig;
			tr[tot].lef=mid+1;
			tr[tot].lefson=tr[tot].rigson=-1;
			tr[tot].Max=0;tr[tot].Maxid=mid+1;
		}
		modify(tr[id].rigson,fixid,fixnum);
		update(id);
	}
}
inline void merge(int id,int Lid){
	if(tr[id].lef==tr[id].rig){tr[id].Max+=tr[Lid].Max;return;}
	if(tr[Lid].lefson!=-1){
		if(tr[id].lefson==-1)tr[id].lefson=tr[Lid].lefson;
		else merge(tr[id].lefson,tr[Lid].lefson);
	}
	if(tr[Lid].rigson!=-1){
		if(tr[id].rigson==-1)tr[id].rigson=tr[Lid].rigson;
		else merge(tr[id].rigson,tr[Lid].rigson);
	}
	update(id);
}
inline void dfs2(int id,int fa){
	for(auto v : e[id])if(v!=fa){dfs2(v,id);merge(rt[id],rt[v]);}
	ans[id]=(tr[rt[id]].Max==0?0:tr[rt[id]].Maxid);
}
signed main(){
	cin>>n>>m;
	for(int i=1,u,v;i<n;i++){
		cin>>u>>v;e[u].emplace_back(v);
		e[v].emplace_back(u);
	}
	for(int i=1;i<=n;i++){
		rt[i]=++tot;tr[tot].lefson=-1;tr[tot].rigson=-1;
		tr[tot].lef=1;tr[tot].rig=100000;tr[tot].Max=0;tr[tot].Maxid=1;
	}
	dfs(1,0);
	while(m--){
		cin>>u>>v>>z;
		if(Dep[u]<Dep[v])swap(u,v);int Fu=u,Fv=v;
		for(int i=log(Dep[u]);i>=0;i--)
			if(Dep[f[Fu][i]]>=Dep[v])Fu=f[Fu][i];
		for(int i=log(Dep[Fu]);i>=0;i--)
			if(f[Fu][i]!=f[Fv][i])Fu=f[Fu][i],Fv=f[Fv][i];
		if(Fu!=Fv)Fu=f[Fu][0],Fv=f[Fv][0];
		modify(rt[u],z,1);
		modify(rt[v],z,1);
		modify(rt[Fu],z,-1);
		if(f[Fu][0]!=0)modify(rt[f[Fu][0]],z,-1);
	}
	dfs2(1,0);
	for(int i=1;i<=n;i++)cout<<ans[i]<<"\n";
}
2024/6/26 19:15
加载中...