求调错,15WA求助!!!二分+LCA+树上边差分
查看原帖
求调错,15WA求助!!!二分+LCA+树上边差分
502707
2021hych楼主2022/3/18 23:27
#include<bits/stdc++.h>
#define M 300050
#define N 300050
using namespace std;
int n,m;
int a,b,t;
int ver[2*M],edge[2*M],head[N],Next[2*M],tot;
int p[N][21],dep[N],len[N];
int l,r;
int ans;
int d[N];
int pre[N];
struct node {
	int u,v,LCA,dis;
}s[M];
bool cmp(node x,node y) {
	return x.dis>y.dis;
}
void add(int u,int v,int w) {
	edge[++tot]=w;
	ver[tot]=v;
	Next[tot]=head[u];
	head[u]=tot;
}
void dfs(int u,int fa) {
	p[u][0]=fa;
	dep[u]=dep[fa]+1;
	for(int i=head[u];i;i=Next[i]) {
		int v=ver[i];
		if(v==fa) continue;
		pre[v]=edge[i];
		len[v]=len[u]+pre[v];
		dfs(v,u);
	}
}
int lca(int x,int y) {
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=20;i>=0;i--)
		if(dep[x]-(1<<i)>=dep[y]) x=p[x][i];
	if(x==y) return x;
	for(int i=20;i>=0;i--)
		if(p[x][i]!=p[y][i]) {
			x=p[x][i];
			y=p[y][i];
		}
	return p[x][0];
}
void dfs1(int u,int fa) {
	for(int i=head[u];i;i=Next[i]) {
		int v=ver[i];
		if(v==fa) continue;
		dfs(v,u);
		d[u]+=d[v];
	}
}
bool check(int x) {
	int cnt=0,maxn=0;
	memset(d,0,sizeof(d));
	for(int i=1;i<=m;i++) {
		if(s[i].dis>x) {
			d[s[i].u]++;
			d[s[i].v]++;
			d[s[i].LCA]-=2;
			cnt++;
		}
	}
	dfs1(1,0);
	for(int i=1;i<=n;i++)
		if(d[i]==cnt) maxn=max(maxn,pre[i]);
	return s[1].dis-maxn<=x;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<n;i++) {
		cin>>a>>b>>t;
		add(a,b,t);
		add(b,a,t);
	}
	dfs(1,0);
	for(int j=1;(1<<j)<=n;j++)
		for(int i=1;i<=n;i++) p[i][j]=p[p[i][j-1]][j-1];
	for(int i=1;i<=m;i++) {
		cin>>s[i].u>>s[i].v;
		s[i].LCA=lca(s[i].u,s[i].v);
		s[i].dis=len[s[i].u]+len[s[i].v]-2*len[s[i].LCA];
		r=max(r,s[i].dis);
	}
	sort(s+1,s+m+1,cmp);
	while(l<=r) {
		int mid=l+r>>1;
		if(check(mid)) {
			r=mid-1;
			ans=mid;
		}
		else l=mid+1;
	}
	cout<<ans;
	return 0;
}
2022/3/18 23:27
加载中...