萌新WA10求助
查看原帖
萌新WA10求助
200044
JS_TZ_ZHR楼主2020/7/23 09:02

RT

#include<bits/stdc++.h>
using namespace std;
int n,m,dep[500005],f[500005][25],lg[500005],u,v,w,l,r,mid,ans;
int dis[500005],sum[500005];
struct node {
	int to,dis;
};
vector<node>ve[500005];
struct path {
	int x,y,lca,dis;
} p[500005];
void dfs(int now,int fa) {
	f[now][0]=fa;
	dep[now]=dep[fa]+1;
	for(int i=1; i<lg[dep[now]]; i++)
		f[now][i]=f[f[now][i-1]][i-1];
	for(int i=0; i<ve[now].size(); i++)
		if(ve[now][i].to!=fa) {
			dis[ve[now][i].to]=ve[now][i].dis+dis[now];
			dfs(ve[now][i].to,now);
		}
}
int LCA(int x,int y) {
	if(dep[x]>dep[y])swap(x,y);
	while(dep[y]>dep[x])y=f[y][lg[dep[y]-dep[x]]-1];
	if(x==y)return x;
	for(int i=lg[dep[x]]-1; i>=0; i--)
		if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
	return f[x][0];
}
void num(int now,int fa) {
	for(int i=0; i<ve[now].size(); i++) {
		int y=ve[now][i].to;
		if(y==fa)continue;
		num(y,now);
		sum[now]+=sum[y];
	}
}
bool check(int x) {
	int cnt=0,res=0;
	for(int i=1; i<=n; i++)sum[i]=0;
	for(int i=1; i<=m; i++) {
		if(p[i].dis>x) {
			cnt++;
			sum[p[i].x]++,sum[p[i].y]++,sum[p[i].lca]-=2;
			res=max(res,p[i].dis-x);
		}
	}
	if(!cnt)return true;
	num(1,0);
	for(int i=2; i<=n; i++)
		if(sum[i]==cnt&&dis[i]-dis[f[i][0]]>=res)return true;
	return false;
}
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1; i<n; i++) {
		scanf("%d%d%d",&u,&v,&w);
		ve[u].push_back((node) {
			v,w
		});
		ve[v].push_back((node) {
			u,w
		});
	}
	dfs(1,0);
	for(int i=1; i<=m; i++) {
		scanf("%d%d",&p[i].x,&p[i].y);
		p[i].lca=LCA(p[i].x,p[i].y);
		p[i].dis=dis[p[i].x]+dis[p[i].y]-dis[p[i].lca]*2;
		r=max(r,p[i].dis);
	}
	while(r>=l) {
		mid=(l+r)>>1;
		if(check(mid))ans=mid,r=mid-1;
		else l=mid+1;
	}
	printf("%d\n",ans);
}
2020/7/23 09:02
加载中...