悬三观求条
查看原帖
悬三观求条
1419569
Z_kazuha楼主2024/10/23 20:41
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,m,l,r,head[N],cnt1,f[N][20],deep[N],dis[N][20],ans,cnt,val[N];
struct node{int to,nxt,w;}e[N];
void add(int u,int v,int w){
	e[++cnt1].to=v;
	e[cnt1].nxt=head[u];
	e[cnt1].w=w;
	head[u]=cnt1;
}
struct Node{int x,y,dis,lca;}q[N];
void dfs(int u,int fa){
	f[u][0]=fa;
	deep[u]=deep[fa]+1;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==fa)continue;
		dfs(v,u);
		dis[v][0]=e[i].w;
	}
}
int lca(int x,int y,int id){
	if(deep[y]>deep[x])swap(x,y);
	for(int i=19;i>=0;i--){
		if(deep[f[x][i]]>=deep[y]){
			q[id].dis+=dis[x][i];
			x=f[x][i];
		}
	}
	if(x==y)return x;
	for(int i=19;i>=0;i--){
		if(f[x][i]!=f[y][i]){
			q[id].dis+=dis[x][i]+dis[y][i];
			x=f[x][i],y=f[y][i];
		}
	}
	q[id].dis+=dis[x][0]+dis[y][0];
	return f[x][0];
}
bool cmp(Node x,Node y){
	return x.dis>y.dis;
}
void addd(int s,int t){
	val[t]++;
	val[s]--;
}
void dfss(int u,int fa){
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==fa)continue;
		dfss(v,u);
		val[u]+=val[v];
	}
}
bool check(int diss){
	cnt=0;
	memset(val,0,sizeof(val));
	for(int i=1;i<=m;i++){
		if(q[i].dis<=diss)break;
		addd(q[i].lca,q[i].x),addd(q[i].lca,q[i].y);
		cnt++;
	}
	dfss(1,0);
	int maxn=0;
	for(int i=1;i<=n;i++){
		if(val[i]==cnt){
			maxn=max(maxn,dis[i][0]);
		}
	}
	return q[1].dis-maxn<=diss;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<n;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w),add(v,u,w);
		l=max(l,w);
	}
	dfs(1,0);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=19;j++){
			f[i][j]=f[f[i][j-1]][j-1];
			dis[i][j]=dis[i][j-1]+dis[f[i][j-1]][j-1];
		}
	}
	for(int i=1;i<=m;i++){
		cin>>q[i].x>>q[i].y;
		q[i].lca=lca(q[i].x,q[i].y,i);
		r=max(r,q[i].dis);
	}
	l=r-l;
	sort(q+1,q+1+m,cmp);
	while(l<=r){
		int mid=(l+r)>>1;
		if(check(mid)){
			ans=mid;
			r=mid-1;
		}
		else l=mid+1;
	}
	cout<<ans;
	return 0;
}
2024/10/23 20:41
加载中...