[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, ...
随机推荐
- SpagoBi开发示例——员工离职人数统计
1.开发工具:SpagoBIStudio_5.1,操作界面和使用方法和eclipse没差 安装参考:http://www.cnblogs.com/starlet/p/4778334.html 2. ...
- Leetcode 15——3Sum
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
- collections deque队列及其他队列
from collections import deque dq = deque(range(10),maxlen=10) dq.rotate(3)#队列旋转操作接受一个参数N,让N>0时,队列 ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- VMware虚拟机误删除vmdk文件后如何恢复?
故障描述: Dell R710系列服务器(用于VMware虚拟主机),Dell MD 3200系列存储(用于存放虚拟机文件),VMware ESXi 5.5版本,因意外断电,导致某台虚拟机不能正常启动 ...
- 国内maven仓库地址 || 某个pom或者jar找不到的解决方法
解决方法 建议在maven仓库中新建settings.xml,然后把如下内容粘贴进去即可.也可以找到maven的安装目录中的conf/settings.xml,把如下的mirrors节复制到对应部分. ...
- C# reportview 按时间改变行颜色
//) AND ((Day(Now()) - Day() AND (Day(Now()) - Day()),) AND (Day(Now()) - Day()) OR (Month(Now()) - ...
- JS中全等和相等操作符的区别和比较规则
一.两者的区别 相等:先强制转换变量类型,再比较 全等:不转换类型,一旦类型不同,就是不全等. 二.相等和不相等的比较规则 1.操作符中有布尔值时: 比较前先将之转换为数值 false => 0 ...
- python的单元测试
单元测试实际上就是一些"断言"(assert)代码 断言就是判断一个函数或对象的一个方法所产生的结果是否符合你期望的那个结果. python中assert断言是声明布尔值为真的判定 ...
- Python之socketserver模块和验证客户端链接的合法性
验证客户端链接的合法性 分布式系统中实现一个简单的客户端链接认证功能 #_*_coding:utf-8_*_ from socket import * import hmac,os secret_ke ...