BZOJ1758: [Wc2010]重建计划
题解:
这题我居然做了一星期?。。。
平均值的极值其实也可以算是一种分数规划,只不过分母上b[i]=1
然后我们就可以二分这个值。类似与 HNOI最小圈
如果没有 链的长度的限制的话,我们直接两遍dfs就可以求出以每个点为起点的最长链,然后看看有没有权值和>0的即可。
但现在链有长度限制。。。
所以膜拜题解。。。
发现我们可以点分治,然后每个节点的合法对象都是一段连续的区间,
当用某个值来更新答案的时候是一个连续的区间。
所以可以单调队列来维护定长的区间最大值问题。
实现的时候好多细节。。。还好卡时过了。。。
注意优化:如果子树节点个数<l就不要递归下去了。
代码:
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#define inf 1000000000
#define maxn 200000+5
#define maxm 200000+5
#define eps 1e-10
#define pa pair<int,int>
#define for0(i,n) for(int i=0;i<=(n);i++)
#define for1(i,n) for(int i=1;i<=(n);i++)
#define for2(i,x,y) for(int i=(x);i<=(y);i++)
#define for3(i,x,y) for(int i=(x);i>=(y);i--)
#define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
#define for5(n,m) for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
#define mod 1000000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
int n,ll,rr,mx[],rt,sum,tot,v[maxn],s[maxn],ss[maxn],head[maxn],q[maxn];
double mid,f[maxn],g[maxn];
struct edge{int go,next;double w;}e[*maxn];
bool del[maxn];
inline void add(int x,int y,double w)
{
e[++tot]=(edge){y,head[x],w};head[x]=tot;
e[++tot]=(edge){x,head[y],w};head[y]=tot;
}
inline void getrt(int x,int fa)
{
ss[x]=;s[x]=;
for4(i,x)if(!del[y]&&y!=fa)
{
getrt(y,x);
s[x]+=s[y];
ss[x]=max(ss[x],s[y]);
}
ss[x]=max(ss[x],sum-s[x]);
if(ss[x]<ss[rt])rt=x;
}
inline void get(int x,int fa,int dep,double w)
{
mx[]=max(mx[],dep);
g[dep]=max(g[dep],w);
for4(i,x)if(!del[y]&&y!=fa)get(y,x,dep+,w+e[i].w-mid);
}
bool solve(int x)
{
del[x]=;mx[]=;
for4(j,x)if(!del[y])
{
mx[]=;
get(y,x,,e[j].w-mid);
int l=,r=;
for3(i,rr,)
{
if(rr-i>&&rr-i<=mx[])
{
while(l<=r&&f[rr-i]>f[q[r]])r--;
q[++r]=rr-i;
}
if(i<=mx[])
{
while(l<r&&q[l]+i<ll)l++;
if(q[l]+i>=ll&&f[q[l]]+g[i]>eps)return ;
}
}
mx[]=max(mx[],mx[]);
for1(i,mx[])f[i]=max(f[i],g[i]),g[i]=-inf;
}
for1(i,mx[])f[i]=-inf;
for4(i,x)if(!del[y])
{
sum=s[y];rt=;
getrt(y,);
if(solve(rt))return ;
}
return ;
}
bool check()
{
for1(i,n)del[i]=,g[i]=-inf,f[i]=-inf;
sum=n;ss[rt=]=inf;
getrt(,);
return solve(rt);
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
n=read();
ll=read();rr=read();
double l=0.0,r;
for1(i,n-){int x=read(),y=read();double z=read();r=max(r,z);add(x,y,z);}
while(r-l>1e-)
{
mid=(l+r)/;
if(check())l=mid;else r=mid;
}
printf("%.3f\n",l);
return ;
}
1758: [Wc2010]重建计划
Time Limit: 40 Sec Memory Limit: 162 MB
Submit: 887 Solved: 314
[Submit][Status]
Description

Input
第二行包含两个正整数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
20%的数据,N<=5000
30%的数据,N<=100000,原有方案恰好为一条路径
100%的数据,N<=100000,1<=L<=U<=N-1,Vi<=1000000
BZOJ1758: [Wc2010]重建计划的更多相关文章
- bzoj1758 [Wc2010]重建计划 & bzoj2599 [IOI2011]Race
两题都是树分治. 1758这题可以二分答案avgvalue,因为avgvalue=Σv(e)/s,因此二分后只需要判断Σv(e)-s*avgvalue是否大于等于0,若大于等于0则调整二分下界,否则调 ...
- BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP
题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...
- [BZOJ1758][WC2010]重建计划(点分治+单调队列)
点分治,对于每个分治中心,考虑求出经过它的符合长度条件的链的最大权值和. 从分治中心dfs下去取出所有链,为了防止两条链属于同一个子树,我们一个子树一个子树地处理. 用s1[i]记录目前分治中心伸下去 ...
- BZOJ1758: [Wc2010]重建计划(01分数规划+点分治+单调队列)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1758 01分数规划,所以我们对每个重心进行二分.于是问题转化为Σw[e]-mid>=0, ...
- BZOJ1758 WC2010 重建计划 二分答案、点分治、单调队列
传送门 看到平均数最大,自然地想到二分答案.那么我们的$check$函数就是要求:是否存在一条长度在$[L,U]$的路径,满足其权值和$\geq 0$. 看到长度在$[L,U]$,自然地想到点分治求解 ...
- 2019.01.21 bzoj1758: [Wc2010]重建计划(01分数规划+长链剖分+线段树)
传送门 长链剖分好题. 题意简述:给一棵树,问边数在[L,R][L,R][L,R]之间的路径权值和与边数之比的最大值. 思路: 用脚指头想都知道要01分数规划. 考虑怎么checkcheckcheck ...
- 洛谷 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 ...
随机推荐
- 从零学起PHP
数据库连接conn.php <?php //第一步:链接数据库 $conn=@mysql_connect("localhost:3306","root", ...
- phpcms常用接口调用方法
常用函数 , 打开include/global.func.php,下面存放一些公共函数 view plaincopy to clipboardprint?function str_charset($i ...
- java 中的equal和"=="
先看一段代码 String str1 = new String("str"); String str2 = new String("str"); System. ...
- Linux进程间通信IPC学习笔记之同步二(Posix 信号量)
Linux进程间通信IPC学习笔记之同步二(Posix 信号量)
- JS 判断一个字符串是否包含在一个数组中
var arr = ["白色", "黑色", "红色", "粉色"]; var sel = "黑色" ...
- 2014年辛星完全解读Javascript第八节 json
json是JavaScript Object Notation的简写,它是一种轻量级的数据交换格式,而且表达上很容易靠字面去理解.json是用于存储和传输数据的格式,通常用于向服务器端传递数据. ** ...
- IOS开发之表视图添加索引
我们要实现的效果如下. 1.修改ControlView.h,即添加变量dict,用于存储TabelView的数据源. #import <UIKit/UIKit.h> @interface ...
- jsf2.0视频
jsf2.0 入门视频 教程 需要的看下.初次录视频.还有很多需要完善. JSF交流QQ群84376982 JSF入门视频下载地址 http://pan.baidu.com/s/1jG3y4T4 ...
- Mac - 更新 Ruby
因为准备在项目中使用bootstrap,在安装bootstrap过程中提示需要Ruby的版本在1.9.2以上,而目前使用的Ruby版本是Mac系统自带的1.8.7.所以需要对Ruby进行升级.这里使用 ...
- bnuoj 27987 Record of the Attack at the Orbit (模拟)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=27987 [题意]:给定坐标输出图形 [题解]:处理坐标上的小技巧 [code]: #include ...