帅哥们帮帮蒟蒻吧,都只有10pts捏
查看原帖
帅哥们帮帮蒟蒻吧,都只有10pts捏
556740
hzx360楼主2024/2/26 20:41

又T又WA

#include<bits/stdc++.h>
using namespace std;
#define re register
const int N=5e5+100; 
const double eps=0.00001,inf=-10000000;
int n,L,R,sum; bool vis[N]; vector<int>g[N];
int rt,mx[N],si[N],mxde,nwde; double dis[N],line[N];
int ne[N],to[N],head[N],tot; double w[N];
void add(int x,int y,double z){
	ne[++tot]=head[x];
	to[tot]=y,w[tot]=z;
	head[x]=tot;
	return;
}
void get_dis(int u,double d,int de,int fa){
	nwde=max(nwde,de);
	dis[de]=max(dis[de],d);
	for(int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(v==fa or vis[v]) continue;
		get_dis(v,d+w[i],de+1,u);
	}
	return; 
}
int q[N],h,tail; bool flag;
void cacal(int u){
	mxde=0,h=1,tail=0;//double all=inf;
	for(re int k=head[u];k;k=ne[k]){
		if(flag) return;
		int v=to[k];	
		if(vis[v]) continue;
		nwde=0,get_dis(v,w[k],1,u);
		int i=nwde,j=-1;
		while(i+1>R) i--;
		for(;i>=1;i--){
			while(j+1<=mxde and (j+1)+i+1<=R){
				j++;
				while(h<=tail and line[q[tail]]<=line[j]) tail--;
				q[++tail]=j;
			}
			while(h<=tail and q[h]+1+i<L) h++;
			if(dis[i]+line[q[h]]>0) flag=1;
			if(flag) return;
		//	all=max(all,dis[i]+line[q[h]]);
		}
		for(re int o=0;o<=nwde;o++) line[o]=max(line[o],dis[o]),dis[o]=inf;
		mxde=max(mxde,nwde);
	}
	for(re int i=0;i<=mxde;i++) line[i]=inf;
	return;
}
void solve(int u){ 
	vis[u]=1;
	cacal(u);
	if(flag) return;
	for(re int i=0;i<g[u].size();i++){
		solve(g[u][i]);
		if(flag) return;
	}
	return;
}
void get_rt(int u,int fa){
	mx[u]=0,si[u]=1;
	for(re int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(v==fa or vis[v]) continue;
		get_rt(v,u);
		si[u]+=si[v];
		mx[u]=max(mx[u],si[v]);
	}
	mx[u]=max(mx[u],sum-si[u]);
	if(mx[u]<=mx[rt]) rt=u;
	return;
}
void build(int u,int fa){
	vis[u]=1;
	for(re int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(v==fa or vis[v]) continue;
		sum=si[v],rt=0,mx[rt]=n+1;
		get_rt(v,u);
		g[u].push_back(v);
	}
	for(re int i=0;i<g[u].size();i++) build(g[u][i],0);
	return;
}
int main(){
	double l=-inf,r=0,ans=0;
	cin>>n>>L>>R; L++,R++;
	for(re int i=1;i<n;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z*1.0),add(y,x,z*1.0);
		l=min(l,z*1.0),r=max(r,z*1.0);
	}
	int RT;
	sum=n,rt=0,mx[rt]=n+1;
	get_rt(1,0),RT=rt,build(rt,0);
	while(r-l>=eps){
		for(re int i=0;i<=n;i++) dis[i]=line[i]=inf,vis[i]=0;
		double mid=(l+r)/2;
		for(re int i=1;i<=tot;i++) w[i]-=mid;
		flag=0,solve(RT);
		if(flag) l=mid+eps,ans=mid;
		else r=mid-eps;
		for(re int i=1;i<=tot;i++) w[i]+=mid;
	}
	printf("%.3lf",ans);
	return 0;
}
/*
5 
3 3
1 2 3
2 3 5
2 4 2
4 5 1
*/
2024/2/26 20:41
加载中...