[Wc2010]重建计划
Description

Input
第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai,Bi,Vi分别表示道路(Ai,Bi),其价值为Vi 其中城市由1..N进行标号
Output
输出最大平均估值,保留三位小数
Sample Input
2 3
1 2 1
1 3 2
1 4 3
Sample Output
HINT
N<=100000,1<=L<=U<=N-1,Vi<=1000000
题解在这里
#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]重建计划的更多相关文章
- BZOJ1758: [Wc2010]重建计划
题解: 这题我居然做了一星期?... 平均值的极值其实也可以算是一种分数规划,只不过分母上b[i]=1 然后我们就可以二分这个值.类似与 HNOI最小圈 如果没有 链的长度的限制的话,我们直接两遍df ...
- 洛谷 P4292 [WC2010]重建计划 解题报告
P4292 [WC2010]重建计划 题目描述 \(X\)国遭受了地震的重创, 导致全国的交通近乎瘫痪,重建家园的计划迫在眉睫.\(X\)国由\(N\)个城市组成, 重建小组提出,仅需建立\(N-1\ ...
- [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行描述重建小组的原有方案 ...
- 【bzoj1758】[Wc2010]重建计划
Description Input 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案, ...
- BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP
题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...
- bzoj1758 [Wc2010]重建计划 & bzoj2599 [IOI2011]Race
两题都是树分治. 1758这题可以二分答案avgvalue,因为avgvalue=Σv(e)/s,因此二分后只需要判断Σv(e)-s*avgvalue是否大于等于0,若大于等于0则调整二分下界,否则调 ...
- BZOJ1758: [Wc2010]重建计划(01分数规划+点分治+单调队列)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1758 01分数规划,所以我们对每个重心进行二分.于是问题转化为Σw[e]-mid>=0, ...
随机推荐
- 第201621123043 《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计. 2 ...
- 2017 国庆湖南 Day5
期望得分:76+80+30=186 实际得分:72+10+0=82 先看第一问: 本题不是求方案数,所以我们不关心 选的数是什么以及的选的顺序 只关心选了某个数后,对当前gcd的影响 预处理 cnt[ ...
- 数据恢复案例分享:MSSQL 2000 错误823
一.故障描述 MSSQL Server 2000 附加数据库错误823,附加数据库失败.数据库没有备份,不能通过备份恢复数据库,急需恢复数据库中的数据. 二.故障分析SQL Server数据库 823 ...
- JAVA_SE基础——26.[深入解析]局部变量与成员变量的区别
黑马程序员入学blog ... 如果这章节很难懂的话应该返回去先看 JAVA_SE基础--10.变量的作用域 定义的位置上区别: 1. 成员变量是定义在方法之外,类之内的. 2. 局部变量是定义在方 ...
- MySQL Group Relication 部署环境入门篇
一:环境介绍 cenos 6.7 版本 数据库的版本5.7.19 二:部署规划单机多实例的部署 端口号 数据目录 group_repplicatoon 通信接口 3307 /data ...
- JWT
Web安全通讯之Token与JWT http://blog.csdn.net/wangcantian/article/details/74199762 javaweb多说本地身份说明(JWT)之小白技 ...
- LDAP是什么
LDAP的英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.LDAP目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的 ...
- JS解析JSON字符串
问题描述:后台需要传递给前台一些数据,用于页面数据显示,因为是一些Lable标签,所以数据传递到前台需要解析. 思路:因为数据比较杂乱,所以我选择传递的数据类型是Json格式,但是数据展示时需要解析成 ...
- Mysql变量列表
变量表解释 (https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html)
- codeforces 761B Dasha and friends
https://vjudge.net/problem/CodeForces-761B 题意: 有一个圆形跑道,上面有若干个障碍,分别给出两个人距离障碍的距离,问这两个人是否是在同一个跑道上跑步(我是这 ...