P4292 [WC2010]重建计划
无脑上二分+淀粉质完事了
每个子树算的时候把儿子按照最长路径从小到大依次做,和前面的单调队列算一波,每个儿子的复杂度不超过这个子树大小
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,L,R;
int fir[100010],dis[200010],nxt[200010],w[200010],id;
il vd link(int a,int b,int c){nxt[++id]=fir[a],fir[a]=id,dis[id]=b,w[id]=c;}
std::vector<std::pair<int,int> >G[100010];std::vector<int>Rt[100010];
int RT;
namespace build{
bool vis[100010];
int siz[100010],f[100010],N,rt;
il vd getrt(int x,int fa=-1){
siz[x]=1;f[x]=0;
for(int i=fir[x];i;i=nxt[i]){
if(dis[i]==fa||vis[dis[i]])continue;
getrt(dis[i],x);
siz[x]+=siz[dis[i]];
f[x]=std::max(f[x],siz[dis[i]]);
}
f[x]=std::max(f[x],N-siz[x]);
if(f[x]<f[rt])rt=x;
}
int maxl[100010];il bool cmp(const std::pair<int,int>&a,const std::pair<int,int>&b){return maxl[a.first]<maxl[b.first];}
il vd dfs(int x,int fa=-1){
maxl[x]=0;
for(int i=fir[x];i;i=nxt[i]){
if(dis[i]==fa||vis[dis[i]])continue;
dfs(dis[i],x);
maxl[x]=std::max(maxl[x],maxl[dis[i]]+1);
}
}
il vd build(int x){
vis[x]=1;
for(int i=fir[x];i;i=nxt[i])if(!vis[dis[i]])G[x].push_back(std::make_pair(dis[i],w[i]));
dfs(x);
std::sort(G[x].begin(),G[x].end(),cmp);
for(int i=0;i<G[x].size();++i){
rt=0;N=siz[G[x][i].first];getrt(G[x][i].first);
Rt[x].push_back(rt);build(rt);
}
}
il vd build(){
rt=0;f[0]=1e9;N=n;getrt(1);
RT=rt;build(rt);
}
}
double mid,res;
namespace dfz{
bool vis[100010];
double f[100010],g[100010];
int que[100010],hd,tl;
int N;
bool flg;
il vd dfs(int x,int fa=-1,int len=0,double sum=0){
if(N<len)g[N=len]=sum;
else g[len]=std::max(g[len],sum);
for(int i=fir[x];i;i=nxt[i]){
if(dis[i]==fa||vis[dis[i]])continue;
dfs(dis[i],x,len+1,sum+w[i]-mid);
}
}
il vd divide(int x){
vis[x]=1;int n=0;f[0]=0;
for(int i=0;i<G[x].size();++i){
N=0;g[0]=0;dfs(G[x][i].first,x,1,G[x][i].second-mid);
hd=tl=0;
for(int j=0,p=n;j<=N;++j){
while(~p&&p+j>=L){
while((hd^tl)&&f[que[tl-1]]<f[p])--tl;
que[tl++]=p--;
}
while((hd^tl)&&que[hd]+j>R)++hd;
if((hd^tl)&&f[que[hd]]+g[j]>0){flg=1;return;}
}
for(int i=0;i<=n;++i)f[i]=std::max(f[i],g[i]);
for(int i=n+1;i<=N;++i)f[i]=g[i];
n=N;
}
for(int i=0;i<Rt[x].size();++i){
divide(Rt[x][i]);
if(flg)return;
}
}
il vd clear(){flg=0;memset(vis,0,sizeof vis);}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
n=gi(),L=gi(),R=gi();
int a,b,c;for(int i=1;i<n;++i)a=gi(),b=gi(),c=gi(),link(a,b,c),link(b,a,c);
build::build();
double l=1,r=1000000;
while(r-l>1e-4){
mid=(l+r)*0.5;
dfz::clear();
dfz::divide(RT);
if(dfz::flg)l=mid;
else r=mid;
}
l=(l+r)*0.5;printf("%.3lf\n",l);
return 0;
}
P4292 [WC2010]重建计划的更多相关文章
- 洛谷 P4292 [WC2010]重建计划 解题报告
P4292 [WC2010]重建计划 题目描述 \(X\)国遭受了地震的重创, 导致全国的交通近乎瘫痪,重建家园的计划迫在眉睫.\(X\)国由\(N\)个城市组成, 重建小组提出,仅需建立\(N-1\ ...
- 并不对劲的bzoj1758:p4292:[WC2010]重建计划
题目大意 \(n\)(\(n\leq10^5\))个点的一棵树,有边权\(w\),给定\(l,r\),求边数在\([l,r]\)中的路径的平均边权的最大值 题解 二分答案,判断时将边权变成\(w-mi ...
- BZOJ 1758 / Luogu P4292 [WC2010]重建计划 (分数规划(二分/迭代) + 长链剖分/点分治)
题意 自己看. 分析 求这个平均值的最大值就是分数规划,二分一下就变成了求一条长度在[L,R]内路径的权值和最大.有淀粉质的做法但是我没写,感觉常数会很大.这道题可以用长链剖分做. 先对树长链剖分. ...
- P4292 [WC2010]重建计划 点分治+单调队列
题目描述 题目传送门 分析 看到比值的形式就想到 \(01分数规划\),二分答案 设当前的值为 \(mids\) 如果存在\(\frac{\sum _{e \in S} v(e)}{|S|} \geq ...
- 洛谷 P4292 - [WC2010]重建计划(长链剖分+线段树)
题面传送门 我!竟!然!独!立!A!C!了!这!道!题!incredible! 首先看到这类最大化某个分式的题目,可以套路地想到分数规划,考虑二分答案 \(mid\) 并检验是否存在合法的 \(S\) ...
- BZOJ1758: [Wc2010]重建计划
题解: 这题我居然做了一星期?... 平均值的极值其实也可以算是一种分数规划,只不过分母上b[i]=1 然后我们就可以二分这个值.类似与 HNOI最小圈 如果没有 链的长度的限制的话,我们直接两遍df ...
- [WC2010]重建计划 长链剖分
[WC2010]重建计划 LG传送门 又一道长链剖分好题. 这题写点分治的人应该比较多吧,但是我太菜了,只会长链剖分. 如果你还不会长链剖分的基本操作,可以看看我的长链剖分总结. 首先一看求平均值最大 ...
- bzoj 1758 [Wc2010]重建计划 分数规划+树分治单调队列check
[Wc2010]重建计划 Time Limit: 40 Sec Memory Limit: 162 MBSubmit: 4345 Solved: 1054[Submit][Status][Disc ...
- bzoj 1758: [Wc2010]重建计划
Description Input 第 一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案 ...
随机推荐
- Gson解析复杂JSON字符串的两种方式
JSON解析可以使用的库: JSONObject(源自Android官方). Gson(源自Google). Jackson(第三方开源库). FastJSON(第三方开源库). 本文例子使用Goog ...
- Java 注解用法详解——@SuppressWarnings
转自: https://www.cnblogs.com/fsjohnhuang/p/4040785.html Java魔法堂:注解用法详解——@SuppressWarnings 一.前言 编码时我 ...
- Css基础笔记(部分)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Python抓取zabbix性能监控图
一.通过查询zabbix db的方式通过主机IP获取到所需要的graphid(比如CPU监控图.内存监控图等,每个图对应一个graphid),最后将图片保存到本地 注:该graph必须要在 scree ...
- Linux内核参数基础优化
web 服务负载均衡器常规网站服务器优化的基本配置: net.ipv4.tcp_fin_timeout =2 net.ipv4.tcp_tw_reuse =1 net.ipv4.tcp_tw_recy ...
- python 函数闭包()
闭包(closure) 当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回函数中,这种结果,叫闭包 example1: de ...
- 解决:Host xxx.xxx.xxx.xxx is blocked because of many connection errors.
Host "xxx.xxx.xxx.xxx" is blocked because of many connection errors 1.原因:当使用错误的密码连接mysql时, ...
- JavaSript模块规范 - AMD规范与CMD规范介绍[转]
原文地址:http://blog.chinaunix.net/uid-26672038-id-4112229.html JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什 ...
- 《阿里巴巴 Java 开发手册》划重点!
[强制]小数类型为 decimal,禁止使用 float 和 double. 说明:float 和 double 在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不 正确的结果.如果存储的数 ...
- h5实现手机端等级进度条
h5实现等级进度条 需求如下: 实现一个动画进度条,页面一打开实现一个进度条动画,因为App这个页面会经常改,所以没有使用原审Android或者IOS来实现,希望通过H5来做: 服务器端返回如下数据: ...