Description

Input

第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai,Bi,Vi分别表示道路(Ai,Bi),其价值为Vi 其中城市由1..N进行标号

Output

输出最大平均估值,保留三位小数

Sample Input

4
2 3
1 2 1
1 3 2
1 4 3

Sample Output

2.500

HINT

N<=100000,1<=L<=U<=N-1,Vi<=1000000

题解在这里

ZYYS

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node
{
int next,to;
double d,c;
}edge[];
int num,head[],size[],maxsize[],minsize,root;
int rt[],tot,n,fa[],L,U,dep[];
double mx[],dist[];
bool vis[];
void add(int u,int v,double d)
{
num++;
edge[num].next=head[u];
head[u]=num;
edge[num].to=v;
edge[num].d=d;
}
void get_size(int x,int pa)
{int i;
size[x]=;maxsize[x]=;
for (i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if (v==pa||vis[v]) continue;
get_size(v,x);
size[x]+=size[v];
if (size[v]>maxsize[x]) maxsize[x]=size[v];
}
}
void get_root(int x,int pa,int r)
{int i;
maxsize[x]=max(maxsize[x],size[r]-size[x]);
if (maxsize[x]<minsize)
{
minsize=maxsize[x];
root=x;
}
for (i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if (v==pa||vis[v]) continue;
get_root(v,x,r);
}
}
void pre_divide(int x)
{int i;
minsize=2e9;
get_size(x,);
get_root(x,,x);
rt[++tot]=root;
vis[root]=;
for (i=head[root];i;i=edge[i].next)
{
int v=edge[i].to;
if (vis[v]==)
pre_divide(v);
}
}
void pre(double x)
{int i;
for (i=;i<=n;i++)
{
edge[i*-].c=edge[i*-].d-x;
edge[i*].c=edge[i*].d-x;
vis[i]=;mx[i]=-2e9;
}
}
bool pd(int root)
{int i;
int maxdep=;
int q[],h=,t=,I,Q[];
for (I=head[root];I;I=edge[I].next)
{
int v=edge[I].to;
if (vis[v]) continue;
h=;t=;
fa[v]=root;dist[v]=edge[I].c;
dep[v]=;
q[]=v;
while (h<t)
{
h++;
int u=q[h];
if (dep[u]==U) break;
for (i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if (fa[u]!=v&&vis[v]==)
{
fa[v]=u;
dep[v]=dep[u]+;
dist[v]=dist[u]+edge[i].c;
t++;
q[t]=v;
}
}
}
int hh=,tt=,now=maxdep;
for (i=;i<=t;i++)
{
int x=q[i];
while (dep[x]+now>=L&&now>=)
{
while (hh<tt&&mx[Q[tt]]<mx[now]) tt--;
tt++;Q[tt]=now;now--;
}
while (hh<tt&&Q[hh+]+dep[x]>U) hh++;
if (hh<tt&&mx[Q[hh+]]+dist[x]>=) return ;
}
maxdep=max(maxdep,dep[q[t]]);
for (i=;i<=t;i++)
{
fa[q[i]]=;
if (dist[q[i]]>mx[dep[q[i]]]) mx[dep[q[i]]]=dist[q[i]];
}
}
for (i=;i<=maxdep;i++)
mx[i]=-2e9;
return ;
}
bool check(int root,int &num)
{int i;
vis[root]=;
if (pd(root)) return ;
for (i=head[root];i;i=edge[i].next)
{
int v=edge[i].to;
if (vis[v]==)
{
num++;
if (check(rt[num],num)) return ;
}
}
return ;
}
int main()
{int i,u,v;
double d,r,eps=1e-;
cin>>n;
cin>>L>>U;
for (i=;i<=n-;i++)
{
scanf("%d%d%lf",&u,&v,&d);
add(u,v,d);add(v,u,d);
r=max(r,d);
}
pre_divide();
double l=;
while (r-l>eps)
{
double mid=(l+r)/2.0;
pre(mid);
int tot=;
if (check(rt[],tot)) l=mid;
else r=mid;
}
printf("%.3lf",(l+r)/2.0);
}

[Wc2010]重建计划的更多相关文章

  1. BZOJ1758: [Wc2010]重建计划

    题解: 这题我居然做了一星期?... 平均值的极值其实也可以算是一种分数规划,只不过分母上b[i]=1 然后我们就可以二分这个值.类似与 HNOI最小圈 如果没有 链的长度的限制的话,我们直接两遍df ...

  2. 洛谷 P4292 [WC2010]重建计划 解题报告

    P4292 [WC2010]重建计划 题目描述 \(X\)国遭受了地震的重创, 导致全国的交通近乎瘫痪,重建家园的计划迫在眉睫.\(X\)国由\(N\)个城市组成, 重建小组提出,仅需建立\(N-1\ ...

  3. [WC2010]重建计划 长链剖分

    [WC2010]重建计划 LG传送门 又一道长链剖分好题. 这题写点分治的人应该比较多吧,但是我太菜了,只会长链剖分. 如果你还不会长链剖分的基本操作,可以看看我的长链剖分总结. 首先一看求平均值最大 ...

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

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

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

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

  6. 【bzoj1758】[Wc2010]重建计划

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

  7. BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP

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

  8. bzoj1758 [Wc2010]重建计划 & bzoj2599 [IOI2011]Race

    两题都是树分治. 1758这题可以二分答案avgvalue,因为avgvalue=Σv(e)/s,因此二分后只需要判断Σv(e)-s*avgvalue是否大于等于0,若大于等于0则调整二分下界,否则调 ...

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

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

随机推荐

  1. RPC原理解析

    1.RPC原理解析 1.1 什么是RPC RPC(Remote Procedure Call Protocol) --远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络 ...

  2. 安装/或更新node和npm

    1.安装/或更新node和npm     安装node: node 的官网 nodejs.org 去下载 msi 安装包     更新npm: 使用命令  npm install npm@latest ...

  3. 第四十四条:为所有导出的API元素编写文档注释

    简而言之,要为API编写文档,文档注释是最好,最有效的途径.对于所有可导出的API元素来说,使用文档注释应该被看作是强制性的.要 采用一致的风格来遵循标准的约定.记住,在文档注释内部出现任何的HTML ...

  4. Python之旅_第一章Python入门

    一.编程语言分类 1.机器语言:即计算机能听懂的二进制语言,0000 0001,直接操控硬件: 2.汇编语言:简写的英文标识符代替二进制语言,本质同样是直接操控硬件: 3.高级语言:用更贴近人类的语言 ...

  5. Python之socketserver模块和验证客户端链接的合法性

    验证客户端链接的合法性 分布式系统中实现一个简单的客户端链接认证功能 #_*_coding:utf-8_*_ from socket import * import hmac,os secret_ke ...

  6. vue computed 原理

    vue computed 主要依靠数据依赖来更新,这里不展示computed源代码,只展示核心思想. computed: { a(){ return this.b ++ } } data:{ b: 1 ...

  7. Python/MySQL(二、表操作以及连接)

    Python/MySQL(二.表操作以及连接) mysql表操作: 主键:一个表只能有一个主键.主键可以由多列组成. 外键 :可以进行联合外键,操作. mysql> create table y ...

  8. Linux磁盘分区-rpm-yum

    一.磁盘分区 1.开启Linux系统前添加一块大小为15G的SCSI硬盘 2.开启系统,右击桌面,打开终端 3.为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区 ...

  9. python3全栈开发-面向对象的三大特性(继承,多态,封装)之继承

    一 .初识继承 1.什么是继承 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类. 特点: 子类会“”遗传”父类的属 ...

  10. SpringMVC(十二):SpringMVC 处理输出模型数据之@ModelAttribute

    Spring MVC提供了以下几种途径输出模型数据:1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据:2)Map及Model:处理方法入参 ...