TLE95分,求助卡常
查看原帖
TLE95分,求助卡常
431487
_zdc_楼主2021/9/19 20:05

RT,调不动了

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n,m,u,v,w,maxn,id,cnt,maxnn,dep[N],f[N][25],d[N],dis[N],l=-1,r;
struct edge{
	int to;
	int val;
};
vector<edge> nbr[N];
struct node{
	int u;
	int v;
	int Lca;
	int dist;
}a[N];
inline void dfs(int cur,int fa){
	f[cur][0]=fa;
	dep[cur]=dep[fa]+1;
	for(int i=1;(1<<i)<=n;i++)
		f[cur][i]=f[f[cur][i-1]][i-1];
	for(int i=0;i<nbr[cur].size();i++){
		int son=nbr[cur][i].to,w=nbr[cur][i].val;
		if(son==fa) continue;
		dis[son]=dis[cur]+w;
		dfs(son,cur);
	}
	return;
}
inline int lca(int u,int v){
	if(dep[u]<dep[v]) swap(u,v);
	for(int i=18;i>=0;i--)
		if(dep[f[u][i]]>=dep[v])
			u=f[u][i];
	if(u==v) return u;
	for(int i=18;i>=0;i--)
		if(f[u][i]!=f[v][i]){
			u=f[u][i];
			v=f[v][i];
		}
	return f[u][0];
}
inline int get_dis(int x,int y){
	return dis[x]+dis[y]-2*dis[lca(x,y)];
}
inline void dfs_tr(int cur){
	for(int i=0;i<nbr[cur].size();i++){
		int son=nbr[cur][i].to;
		if(son==f[cur][0]) continue;
		dfs_tr(son);
		d[cur]+=d[son];
	}
	return;
}
inline void dfs_ans(int cur){
	for(int i=0;i<nbr[cur].size();i++){
		int son=nbr[cur][i].to,w=nbr[cur][i].val;
		if(son==f[cur][0]) continue;
		if(d[son]==cnt) maxnn=max(maxnn,w);
		dfs_ans(son);
	}
	return;
}
inline bool check(int x){
	memset(d,0,sizeof(d));
	maxn=maxnn=-1;
	for(int i=1;i<=m;i++)
		if(maxn<a[i].dist){
			maxn=a[i].dist;
			id=i;
		}
	if(maxn<=x) return true;
	cnt=0;
	for(int i=1;i<=m;i++)
		if(a[i].dist>x){
			d[a[i].u]++;d[a[i].v]++;
			d[a[i].Lca]-=2;
			cnt++;
		}
	dfs_tr(1);dfs_ans(1);
	return maxn-maxnn<=x;
}
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int main(){
	n=read();m=read();
	for(int i=1;i<n;i++){
		u=read();v=read();w=read();
		nbr[u].push_back((edge){v,w});
		nbr[v].push_back((edge){u,w});
	}
	dfs(1,0);
	for(int i=1;i<=m;i++){
		a[i].u=read();a[i].v=read();
		a[i].dist=get_dis(a[i].u,a[i].v);
		r=max(r,a[i].dist);
		a[i].Lca=lca(a[i].u,a[i].v);
	}
	r++;
	while(l+1<r){
		int mid=l+r>>1;
		if(check(mid)) r=mid;
		else l=mid;
	}
	printf("%d",r);
	return 0;
}
2021/9/19 20:05
加载中...