WA#13,玄关,求条
查看原帖
WA#13,玄关,求条
889917
limingyuan333楼主2025/1/23 17:50
#include<bits/stdc++.h>
#define pii pair<int,int>
#define mp make_pair
using namespace std;
const int MAXN=3e5+10;
int n,m;
struct node{
	int to,nxt,w;
}a[MAXN<<1];
int head[MAXN],tot;
void add(int x,int y,int w){
	a[++tot].to=y;
	a[tot].nxt=head[x];
	a[tot].w=w;
	head[x]=tot;
}
int fi[MAXN],se[MAXN],dp[MAXN][21],w[MAXN][21],dep[MAXN];
pii dis[MAXN]; 
void dfs(int now,int fa,int c){
	dp[now][0]=fa,w[now][0]=c,dep[now]=dep[fa]+1;
	for(register int i=1;i<=20;i++){
		dp[now][i]=dp[dp[now][i-1]][i-1];
		w[now][i]=w[now][i-1]+w[dp[now][i-1]][i-1];
	}
	for(register int i=head[now];i;i=a[i].nxt){
		int to=a[i].to;
		if(to==fa)	continue;
		dfs(to,now,a[i].w);
	}
}
pii lca(int x,int y){
	if(dep[x]<dep[y])	swap(x,y);
	long long ans=0;
	for(register int i=20;i>=0;i--){
		if(dep[dp[x][i]]>=dep[y])	ans+=w[x][i],x=dp[x][i];
	}
	if(x==y) return mp(x,ans);
	for(register int i=20;i>=0;i--){
		if(dp[x][i]!=dp[y][i]){
			ans+=w[x][i]+w[y][i];
			x=dp[x][i],y=dp[y][i];
		}
	}
	return mp(dp[x][0],ans+w[x][0]+w[y][0]);
}
int d[MAXN],edge[MAXN],mx;
void to_dfn(int now,int fa){
	for(register int i=head[now];i;i=a[i].nxt){
		int to=a[i].to;
		if(fa==to)	continue;
		to_dfn(to,now);
		d[now]+=d[to];
		edge[i]=d[to];
	}
}
bool check(int x){
	for(register int i=1;i<=n;i++)	d[i]=edge[i]=0;
	int cnt=0;
	for(register int i=1;i<=m;i++){
		if(dis[i].second>x){
			d[fi[i]]++,d[se[i]]++;
			d[dis[i].first]-=2,cnt++;
		}
	}
	if(!cnt)	return 1;
	to_dfn(1,0);
	int maxn=0;
	for(register int i=1;i<=2*n;i++){
		if(edge[i]==cnt)	maxn=max(maxn,a[i].w);
	}
	return mx-maxn<=x;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL),cout.tie(NULL);
	cin>>n>>m;
	for(register int i=1;i<n;i++){
		int u,v,c;cin>>u>>v>>c;
		add(u,v,c),add(v,u,c);
	}
	dfs(1,0,0);
	for(register int i=1;i<=m;i++){
		cin>>fi[i]>>se[i];
		dis[i]=lca(fi[i],se[i]);mx=max(mx,dis[i].second);
	} 
	int l=0,r=3e8+10,num=3e8;
	while(l<=r){
		int mid=l+r>>1;
		if(check(mid))	num=mid,r=mid-1;
		else	l=mid+1;
	}
	cout<<num;
	return 0;
}
2025/1/23 17:50
加载中...