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. iOS开发UIKit框架-可视化编程-XIB

    1. Interface Builder 可视化编程 1> 概述 GUI : 图形用户界面(Graphical User Interface, 简称GUI, 又称图形化界面) 是指采用图形方式显 ...

  2. Linux下ip配置与网络重启

    ip配置 //以下ip配置重启失效 sudo ifconfig 192.168.1.1 sudo ifconfig 192.168.1.1 netmask 255.255.255.0 网络重启 //关 ...

  3. Flask Session 详解

    会话session ,允许你在不同请求 之间储存信息.这个对象相当于用密钥签名加密的 cookie ,即用户可以查看你的 cookie ,但是如果没有密钥就无法修改它. from flask impo ...

  4. 最短路算法模板SPFA、disjkstra、Floyd

    朴素SPFA(链表建边) #include <iostream> #include <cstdio> #include <cstring> #include < ...

  5. JS解析JSON字符串

    问题描述:后台需要传递给前台一些数据,用于页面数据显示,因为是一些Lable标签,所以数据传递到前台需要解析. 思路:因为数据比较杂乱,所以我选择传递的数据类型是Json格式,但是数据展示时需要解析成 ...

  6. 复习HTML+CSS(2)

    n  项目符号嵌套编号思路 标签的内容(文本.项目符号.表格.图片等)必须放在最底层标记中. n  图片标记(行内元素,单边标记) l  语法:<img 属性 = "值"&g ...

  7. 生成git私钥

    在git已经安装的情况下,输入命令: 一.设置git的user name和email git config —(此处两个横杠)global user.name “XXX” git config —(此 ...

  8. python Mysql (二)

    Mysql (二) 一. 事务 a.数据库开启事务命令 1 2 3 4 #start transaction 开启事务 #Rollback 回滚事务,即撤销指定的sql语句(只能回退insert de ...

  9. 字典的update方法

    >>> dict = {"name":"zara", "age": 7} >>> dict2 = {&q ...

  10. springboot集成jpa

    spring data jpa简介 spring data jpa是spring基于hibernate及jpa规范封装出来的一套持久层框架.该框架极大的降低了开发者工作量,提升开发效率.提供的关键字可 ...