有一说一,雨天的尾巴我其实骂了很久。主要是题面之前一直没耐心读,然后后面在其他地方看到了形式化题意,就做掉了。

其实感觉有很多题都比这玩意适合当板子,所以这个迟到的板子就是走个流程,反正权值线段树早就被我娶过门了(?

const ll maxn=1e5+5,maxv=1e9;
ll fa[maxn][18],dep[maxn];
struct node{
	ll id,val,ls,rs;
}t[maxn*50];
vector<ll>e[maxn];
ll tot;
unordered_map<ll,ll>mp;
ll id[maxn],cnt;
ll get_id(ll x){
	if(mp.count(x))return mp[x];
	id[++cnt]=x;
	return mp[x]=cnt;
}
#define mid ((l+r)>>1)
node upd(node it,node x,node y){
	if(x.id>y.id)swap(x,y);
	if(x.val<y.val)it.id=y.id,it.val=y.val;
	else it.id=x.id,it.val=x.val;
	return it;
}
void insert(ll x,ll l,ll r,ll k,ll ty){
	if(l==r){
		t[x].id=l;
		t[x].val+=ty;
		return ;
	}
	if(k<=mid){
		if(!t[x].ls)t[x].ls=++tot;
		insert(t[x].ls,l,mid,k,ty);
	}
	else {
		if(!t[x].rs)t[x].rs=++tot;
		insert(t[x].rs,mid+1,r,k,ty);
	}
	t[x]=upd(t[x],t[t[x].ls],t[t[x].rs]);
}
void merge(ll x,ll y,ll l,ll r){
	if(l==r){
		t[x].val+=t[y].val;
		return ;
	}
	if(t[x].ls){if(t[y].ls)merge(t[x].ls,t[y].ls,l,mid);}
	else {if(t[y].ls)t[x].ls=t[y].ls;}
	if(t[x].rs){if(t[y].rs)merge(t[x].rs,t[y].rs,mid+1,r);}
	else {if(t[y].rs)t[x].rs=t[y].rs;}
	t[x]=upd(t[x],t[t[x].ls],t[t[x].rs]);
}
ll n,m;
void dfs(ll x){
	dep[x]=dep[fa[x][0]]+1;
	for(ll i=1;i<=17;i++){
		fa[x][i]=fa[fa[x][i-1]][i-1];
		if(!fa[x][i])break;
	}
	for(auto v:e[x]){
		if(v==fa[x][0])continue;
		fa[v][0]=x;
		dfs(v);
	}
}
ll query(ll x,ll y){
	if(dep[x]<dep[y])swap(x,y);
	for(ll i=17;i>=0;i--){
		if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
	}
	if(x==y)return x;
	for(ll i=17;i>=0;i--){
		if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
	}
	return fa[x][0];
}
ll ans[maxn];
ll mx;
void work(ll x){
	for(auto v:e[x]){
		if(v==fa[x][0])continue;
		work(v);
		merge(x,v,1,mx);
	}
	ans[x]=(t[x].val!=0?id[t[x].id]:0);
}
struct dat{
	ll x,y,z;
	friend bool operator < (const dat &u,const dat &v){
		return u.z<v.z;
	} 
}q[maxn];
void solve(){
	n=R,m=R;
	mx=m;
	for(ll i=1;i<n;i++){
		ll x=R,y=R;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	tot=n;
	dfs(1);
	for(ll i=1;i<=m;i++){
		q[i].x=R,q[i].y=R,q[i].z=R;
	}
	sort(q+1,q+1+m);
	for(ll i=1;i<=m;i++){
		ll x=q[i].x,y=q[i].y,z=q[i].z;
		z=get_id(z);
		ll lca=query(x,y);
		insert(x,1,mx,z,1);
		insert(y,1,mx,z,1);
		insert(lca,1,mx,z,-1);
		if(lca)insert(fa[lca][0],1,mx,z,-1);
	}
	work(1);
	for(ll i=1;i<=n;i++)we(ans[i]);
	return ;
}

注意离散化值域来压缩空间。

原文地址:http://www.cnblogs.com/rnfmabj/p/luogup4556.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性