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. beta冲刺6

    前言:此篇是补昨天凌晨的.后面有更新但是太晚了就没有即使更新.所以现在过来更新一下. 昨天的未完成: 用户测试+测试报告 目前剩下的功能点:输入内容检测 我的社团输出显示格式调整. 今天的完成: 我的 ...

  2. Alpha第八天

    Alpha第八天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...

  3. C语言博客作业--一二维数组

    一.PTA实验作业 题目1(7-6) (1).本题PTA提交列表 (2)设计思路 //天数n:数组下标i:小时数h,分钟数m:对应书号的标签数组flag[1001] //总阅读时间sum初始化为0,借 ...

  4. Beta预备

    团队名称:稳住!我们能赢 Beta预备: 讨论组长是否重选的议题和结论 项目组长可以说是一个团队的灵魂和核心.一个好的领导者可以激发团队成员的工作热情,提高开发效率,保质保量的完成工作.虽然在Alph ...

  5. Exception in thread "main" expected '<document start>', but found BlockMappingStart in 'reader', line 23, column 2: nimbus.host: "master"

    平台:centos-6.3-i386 jdk-7u51 storm 0.9.1 python 2.6.6   hadoop 1.2.1 启动storm的时候,遇到这个问题,百度之后,看到大家的解决方案 ...

  6. Lucene 的索引文件锁原理

    Lucene 的索引文件锁原理 2016/11/24 · IT技术 · lucene   环境 Lucene 6.0.0Java “1.8.0_111”OS Windows 7 Ultimate 线程 ...

  7. idea搭建springdata+mongodb+maven+springmvc

    idea搭建springdata+mongodb+maven+springmvc 今天我们来学习一下SpringData操作MongoDB. 项目环境:IntelliJ IDEA2017+maven3 ...

  8. SpringMVC 无法访问到指定jsp页面可能的原因

    当出现你的程序可以访问到对应的controller层.但是却无法访问对应的jsp文件时.你首先做的不是检查web.xml等配置文件,而是打开的服务器根文件检查对应路径下的文件是否存在.命名是否正确.命 ...

  9. 使用IDEA快速插入数据库数据的方法

    如上图所示:数据库创建表主键使用了自增列自增因此忽略,只有后两列非主键得数据,在数据较多得时候使用IDEA快捷键Ctrl+R键,快速查找替换.

  10. JQ.ajax 各种参数及属性设置 ( 转载 )

    $.ajax({      type: "post",      url: url,      dataType:'html',      success: function(da ...