二分+加树上差分经典题啦
查看原帖
二分+加树上差分经典题啦
378582
Jack_1218楼主2023/5/2 16:45
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct G{
	int to;
	int val;
	G(int to=0,int val=0):to(to),val(val){}
};
vector<G> h[300005];
int From[300005],To[300005];
int lg[300005];

int sum[300005],D[300005],A[300005][20],edge[300005];
void dfs(int u,int fa){
	A[u][0]=fa;
	for(int i=1;i<20;i++){
		A[u][i]=A[A[u][i-1]][i-1];
	}
	for(G T:h[u]){
		if(T.to==fa) continue;
		edge[T.to]=T.val;
		sum[T.to]=sum[u]+T.val;
		D[T.to]=D[u]+1;
		dfs(T.to,u);
	}
}

int LCA(int u,int v){
	if(D[u]<D[v]) swap(u,v);
	while(D[u]>D[v]){
		u=A[u][lg[D[u]-D[v]]];
	}
	if(u==v) return u;
	for(int i=19;i>=0;i--){
		if(A[u][i]!=A[v][i]){
			u=A[u][i];
			v=A[v][i];
		}
	}
	return A[u][0];
}

int path[300005];

int diff[300005];

void modify(int p,int d){
	diff[p]+=d;
	diff[1]-=d;
}

int ans[300005];

void dfsANS(int u,int fa){
	for(G T:h[u]){
		if(T.to==fa) continue;
		
		dfsANS(T.to,u);
		ans[u]+=ans[T.to];
	}
	ans[u]+=diff[u];
}

bool chk(int x){
	memset(diff,0,sizeof(diff));
	memset(ans,0,sizeof(ans));
	int cnt=0,sub=0;
	for(int i=1;i<=m;i++){
		if(path[i]>x){
			modify(From[i],1);
			modify(To[i],1);
			modify(LCA(From[i],To[i]),-2);
			cnt++;
			sub=max(sub,path[i]-x);
		}	
	}

	dfsANS(1,0);
	for(int i=2;i<=n;i++){
		if(ans[i]==cnt){
			if(edge[i]>=sub){
				return true;
			}
		}
	}
	return false;
}

int main(){
	//freopen("dfd.in","r",stdin);
	//freopen("dfd.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		lg[i]=lg[i-1]+((1<<lg[i-1])==i);
	}
	for(int i=1;i<=n;i++){
		lg[i]--;
	}
	for(int i=1;i<n;i++){
		int u,v,w;
		cin>>u>>v>>w;
		h[u].push_back(G(v,w));
		h[v].push_back(G(u,w));
	}
	
	for(int i=1;i<=m;i++){
		cin>>From[i]>>To[i];
	}
	
	D[1]=1;
	dfs(1,0);
	
	int r=1e9;
	for(int i=1;i<=m;i++){
		path[i]=sum[From[i]]+sum[To[i]]-2*sum[LCA(From[i],To[i])];
		r=min(r,path[i]);
	}
	
	int l=0,mid,ans;
	while(l<=r){
		mid=l+r>>1;
		if(chk(mid)){
			ans=mid;
			r=mid-1;
		} else{
			l=mid+1;
		}
	}
	cout<<ans;
	return 0;
}

实在调不动了,求调(悬赏大号小号各一个关注)!

2023/5/2 16:45
加载中...