code:

#include <bits/stdc++.h>
using namespace std;
#define setIO(s) freopen(s".in","r",stdin)
const int N=200006;
const double eps=1e-6;
const double inf=-100000000;
struct node
{
int u,dep,val;
node(int u=0,int dep=0,int val=0):u(u),dep(dep),val(val){}
};
struct data
{
int len;
double dis;
data(int len=0,double dis=0.0):len(len),dis(dis){}
};
bool cmp(node a,node b) { return a.dep<b.dep; }
deque<data>q;
vector<node>G[N];
vector<int>tree[N];
int n,L,R,edges,root;
int hd[N],to[N<<1],nex[N<<1],val[N<<1];
int size[N],mx[N],vis[N],sn,max_dep,RT;
double maxv[N],tmp[N],mid;
inline void add(int u,int v,int c)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=c;
}
void getroot(int u,int ff)
{
size[u]=1,mx[u]=0;
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(v==ff||vis[v]) continue;
getroot(v,u);
size[u]+=size[v];
mx[u]=max(mx[u],size[v]);
}
mx[u]=max(mx[u],sn-size[u]);
if(mx[u]<mx[root]) root=u;
}
void getdis(int u,int ff,int d)
{
max_dep=max(max_dep,d);
for(int i=hd[u];i;i=nex[i]) if(to[i]!=ff&&!vis[to[i]]) getdis(to[i],u,d+1);
}
void prepare(int u)
{
vis[u]=1;
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(vis[v]) continue;
max_dep=0;
getdis(v,u,1);
G[u].push_back(node(v,max_dep,val[i]));
}
sort(G[u].begin(),G[u].end(),cmp);
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(vis[v]) continue;
sn=size[v];
root=0;
getroot(v,u);
tree[u].push_back(root);
prepare(root);
}
}
void dfs(int u,int ff,int d,double dis)
{
maxv[d]=max(maxv[d],dis);
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(v==ff||vis[v]) continue;
dfs(v,u,d+1,dis+val[i]-mid);
}
}
int calculate(int u)
{
int flag=0;
for(int i=0;i<G[u].size();++i)
{
int v=G[u][i].u;
dfs(v,u,1,G[u][i].val-mid);
for(int j=1;j<=G[u][i].dep;++j) if(maxv[j]>=-eps&&j>=L&&j<=R) { flag=1; break; }
if(i)
{
int tl=min(R,G[u][i-1].dep);
for(int j=1;j<=min(R,G[u][i].dep);++j)
{
for(;tl>=L-j&&tl>0;--tl)
{
while(!q.empty()&&(tmp[tl]-eps)>=q.front().dis) q.pop_front();
q.push_front(data(tl,tmp[tl]));
}
while(!q.empty()&&q.back().len>R-j) q.pop_back();
if(!q.empty())
{
if(maxv[j]+q.back().dis>=-eps)
{
flag=1;
break;
}
}
}
}
while(!q.empty()) q.pop_front();
if(flag) break;
for(int j=1;j<=G[u][i].dep;++j) tmp[j]=max(tmp[j],maxv[j]);
for(int j=0;j<=G[u][i].dep;++j) maxv[j]=inf;
}
if(G[u].size())
{
for(int i=0;i<=G[u][G[u].size()-1].dep;++i) tmp[i]=maxv[i]=inf;
}
while(!q.empty()) q.pop_front();
return flag;
}
int solve(int u)
{
vis[u]=1;
if(calculate(u)) return 1;
for(int i=0;i<tree[u].size();++i) if(solve(tree[u][i])) return 1;
return 0;
}
int main()
{
// setIO("input");
int i,j;
scanf("%d%d%d",&n,&L,&R);
for(i=1;i<n;++i)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z),add(y,x,z);
}
mx[0]=sn=n;
getroot(1,0);
RT=root;
prepare(root);
double l=0.0,r=1000000.0;
for(i=0;i<N;++i) maxv[i]=tmp[i]=inf;
for(int i=33;i>=1;--i)
{
mid=(l+r)/2;
memset(vis,0,sizeof(vis));
if(solve(RT))
{
l=mid;
}
else
{
r=mid;
}
}
printf("%.3f\n",l);
return 0;
}

  

BZOJ 1758: [Wc2010]重建计划 01分数规划+点分治+单调队列的更多相关文章

  1. BZOJ1758: [Wc2010]重建计划(01分数规划+点分治+单调队列)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1758 01分数规划,所以我们对每个重心进行二分.于是问题转化为Σw[e]-mid>=0, ...

  2. bzoj 1758 [Wc2010]重建计划 分数规划+树分治单调队列check

    [Wc2010]重建计划 Time Limit: 40 Sec  Memory Limit: 162 MBSubmit: 4345  Solved: 1054[Submit][Status][Disc ...

  3. BZOJ.1758.[WC2010]重建计划(分数规划 点分治 单调队列/长链剖分 线段树)

    题目链接 BZOJ 洛谷 点分治 单调队列: 二分答案,然后判断是否存在一条长度在\([L,R]\)的路径满足权值和非负.可以点分治. 对于(距当前根节点)深度为\(d\)的一条路径,可以用其它子树深 ...

  4. 【BZOJ 1758】【WC 2010】重建计划 分数规划+点分治+单调队列

    一开始看到$\frac{\sum_{}}{\sum_{}}$就想到了01分数规划但最终还是看了题解 二分完后的点分治,只需要维护一个由之前处理过的子树得出的$tb数组$,然后根据遍历每个当前的子树上的 ...

  5. [WC2010]重建计划(分数规划+点分治+单调队列)

    题目大意:给定一棵树,求一条长度在L到R的一条路径,使得边权的平均值最大. 题解 树上路径最优化问题,不难想到点分治. 如果没有长度限制,我们可以套上01分数规划的模型,让所有边权减去mid,求一条路 ...

  6. [WC2010][BZOJ1758]重建计划-[二分+分数规划+点分治]

    Description 传送门 Solution 看到那个式子,显然想到分数规划...(不然好难呢) 然后二分答案,则每条边的权值设为g(e)-ans.最后要让路径长度在[L,U]范围内的路径权值&g ...

  7. bzoj 1758: [Wc2010]重建计划

    Description Input 第 一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案 ...

  8. BZOJ 1758: [Wc2010]重建计划 [暂时放弃]

    今天晚上思维比较乱,以后再写写吧#include <iostream> #include <cstdio> #include <cstring> #include ...

  9. BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)

    BZOJ 洛谷 裸01分数规划.二分之后就是裸最大费用最大流了. 写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样.. 当然用二分也很慢,用什么什么迭代会很快. [Update] 19. ...

随机推荐

  1. Linux node.js安装

    1.下载地址 下载node 英文网址:https://nodejs.org/en/download/ 中文网址:http://nodejs.cn/download/ 2.下载下来的tar文件上传到服务 ...

  2. Golang 常用的第三方包.

    Goland 下面这个license server 可用 http://idea.youbbs.org (2018-01-10 04:26:09) http://45.77.127.87:81(201 ...

  3. IIS7 URL重写如何针对二级域名重写

    二级域名与站点主域名是绑在同一目录下,想实现访问二级域名重写至站点下的某个目录.  如:  访问so.abc.cn 实际访问的是站点根目录下的search目录下的文件 相当于so.abc.cn绑定至s ...

  4. java jar启动

    linux中启动 java -jar 后台运行程序 直接用java -jar xxx.jar,当退出或关闭shell时,程序就会停止掉.以下方法可让jar运行后一直在后台运行. 1. java -ja ...

  5. 【转】Dubbo分布式服务框架

    Dubbo是一个分布式服务框架,致力于提供高性能和透明化的远程服务调用方案. Dubbo架构 官网架构图: 节点角色说明: Provider: 暴露服务的服务提供方. Consumer: 调用远程服务 ...

  6. hexo更改主题

    github+hexo搭建好个人博客之后,一般都挑选自己喜欢的主题.在这里为大家介绍一下比如何挑选主题以及如何修改主题. 主题选择: 1:知乎推荐 2:hexo官方 本地目录中打开git bash: ...

  7. Redis安装、主从配置及两种高可用集群搭建

    Redis安装.主从配置及两种高可用集群搭建 一.            准备 Kali Linux虚拟机 三台:192.168.154.129.192.168.154.130.192.168.154 ...

  8. 记录axios在IOS上不能发送的问题

    最近 遇到 了axios在IOS上无法发送的问题,测试 了两个 苹果 机,IOS10上不能发送,IOS12可以,百度了下,找到了解决方法.记录下吧 首先引入qs,这个安装axios也已经有了吧:然后在 ...

  9. Java 之 HTTP 协议

    HTTP 协议 一.基础 1.概念 HTTP:Hyper  Text Transfer Protocol 超文本传输协议. 传输协议:定义了客户端和服务器端通信时,发送数据的格式. 2.特点 (1)基 ...

  10. Java 参数个数可变的函数

    示例: package my_package; public class Test { public static void main(String[] args) { out("重庆师范大 ...