bzoj 1758 [Wc2010]重建计划 分数规划+树分治单调队列check
[Wc2010]重建计划
Time Limit: 40 Sec Memory Limit: 162 MB
Submit: 4345 Solved: 1054
[Submit][Status][Discuss]
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 新加数据一组 By leoly,但未重测..2016.9.27
题解:点分上是一个log,二分是一个log,然后是单调队列判断,n,总复杂度O(nlogn^2)
hzwer的代码十分不优秀,应该是按照最低深度从小到大去个棵子树去判断才可以,不然是不行的,
不然会是复杂度退化成n^2
改了比较siz还是T,不知道为什么了。
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<vector> #define inf 1000000007
#define eps 0.0001
#define N 100007
#define M 200007
#define ll long long
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<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,S,L,U,rt,lim;
double ans;
int cnt,hed[N],rea[M],val[M],nxt[M];
int sz[N],fa[N],f[N],dep[N];
int q[N],dq[N];
bool flag[N];
double dis[N],mx[N];
int num[N*],xz,shu[N*]; void add(int u,int v,int w)
{
nxt[++cnt]=hed[u];
hed[u]=cnt;
rea[cnt]=v;
val[cnt]=w;
}
void get_root(int u,int fa)
{
sz[u]=,f[u]=;
for (int i=hed[u];i!=-;i=nxt[i])
{
int v=rea[i];
if (v==fa||flag[v]) continue;
get_root(v,u);
sz[u]+=sz[v];
f[u]=max(f[u],sz[v]);
}
f[u]=max(f[u],S-sz[u]);
if (f[u]<=f[rt])rt=u;
}
bool check(int rt,double zhi)
{
int up=;
for (int i=hed[rt];i!=-;i=nxt[i])
{
int v=rea[i];double fee=(double)val[i]-zhi;
if (flag[v])continue;
int hd=,tl=;
q[]=v;
fa[v]=rt,dep[v]=;
dis[v]=fee;
while(hd!=tl)
{
int now=q[hd];hd++;
for (int i=hed[now];i!=-;i=nxt[i])
{
int v=rea[i];double fee=(double)val[i]-zhi;
if (v==fa[now]||flag[v])continue;
q[tl++]=v;
fa[v]=now,dep[v]=dep[now]+;
dis[v]=dis[now]+fee;
}
}
int l=,r=,now=up;
for (int i=;i<tl;i++)
{
int x=q[i];
while(dep[x]+now>=L&&now>=)
{
while(l<=r&&mx[dq[r]]<mx[now])r--;
dq[++r]=now;
now--;
}
while(l<=r&&dep[x]+dq[l]>U)l++;
if (l<=r&&dis[x]+mx[dq[l]]>=)return ;
}
for (int i=up+;i<=dep[q[tl-]];i++)mx[i]=-inf;
for (int i=;i<tl;i++)
{
int x=q[i];
mx[dep[x]]=max(mx[dep[x]],dis[x]);
}
up=max(up,dep[q[tl-]]);
}
return ;
}
void cal(int u)//可以
{
double l=ans,r=lim,mid;
while(r-l>eps)
{
mid=(l+r)/;
if(check(u,mid))l=mid;
else r=mid;
}
ans=l;
}
bool cmp(int x,int y)
{
return shu[x]<shu[y];
}
void solve(int u)
{
cal(u);
flag[u]=;int yl=xz,Sum=S;
for (int i=hed[u];i!=-;i=nxt[i])
{
int v=rea[i];
if (flag[v])continue;
rt=;
if (sz[v]<sz[u])S=sz[v];
else S=Sum-sz[u];
get_root(v,);
if(sz[v]>L)num[++xz]=rt,shu[++xz]=S;
}
sort(num+yl+,num+xz+,cmp);
for (int i=yl+;i<=xz;i++)
solve(num[i]);
xz=yl;
}
int main()
{
memset(hed,-,sizeof(hed));
n=read(),L=read(),U=read();
for (int i=;i<n;i++)
{
int u=read(),v=read(),w=read();
add(u,v,w),add(v,u,w);
lim=max(lim,w);
}
f[]=n;
rt=,S=n;
get_root(,);
solve(rt);
printf("%.3lf",ans);
}
bzoj 1758 [Wc2010]重建计划 分数规划+树分治单调队列check的更多相关文章
- BZOJ.1758.[WC2010]重建计划(分数规划 点分治 单调队列/长链剖分 线段树)
题目链接 BZOJ 洛谷 点分治 单调队列: 二分答案,然后判断是否存在一条长度在\([L,R]\)的路径满足权值和非负.可以点分治. 对于(距当前根节点)深度为\(d\)的一条路径,可以用其它子树深 ...
- [WC2010]重建计划(分数规划+点分治+单调队列)
题目大意:给定一棵树,求一条长度在L到R的一条路径,使得边权的平均值最大. 题解 树上路径最优化问题,不难想到点分治. 如果没有长度限制,我们可以套上01分数规划的模型,让所有边权减去mid,求一条路 ...
- 【BZOJ 1758】【WC 2010】重建计划 分数规划+点分治+单调队列
一开始看到$\frac{\sum_{}}{\sum_{}}$就想到了01分数规划但最终还是看了题解 二分完后的点分治,只需要维护一个由之前处理过的子树得出的$tb数组$,然后根据遍历每个当前的子树上的 ...
- BZOJ 1758 / Luogu P4292 [WC2010]重建计划 (分数规划(二分/迭代) + 长链剖分/点分治)
题意 自己看. 分析 求这个平均值的最大值就是分数规划,二分一下就变成了求一条长度在[L,R]内路径的权值和最大.有淀粉质的做法但是我没写,感觉常数会很大.这道题可以用长链剖分做. 先对树长链剖分. ...
- BZOJ1758: [Wc2010]重建计划(01分数规划+点分治+单调队列)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1758 01分数规划,所以我们对每个重心进行二分.于是问题转化为Σw[e]-mid>=0, ...
- bzoj 1758: [Wc2010]重建计划
Description Input 第 一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案 ...
- BZOJ 1758: [Wc2010]重建计划 01分数规划+点分治+单调队列
code: #include <bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in", ...
- BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP
题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...
- BZOJ 1758: [Wc2010]重建计划 [暂时放弃]
今天晚上思维比较乱,以后再写写吧#include <iostream> #include <cstdio> #include <cstring> #include ...
随机推荐
- Python——for表达式
一.for表达式 1.for表达式语法格式及用法 for表达式利用可迭代对象创建新的列表,for表达式也称为列表推导式,具体语法格式如下: [表达式 for 循环计数器 in 可迭代对象] 例: a ...
- JTT808、JTT809、JTT796、JTT794、JTT1077、JTT1078区别与交通部道路运输车辆卫星定位系统部标标准大全下载地址
部标JT/T808协议.JT/T809协议.JT/T796标准.JT/T794标准的区别,他们是基于不同的通信场景,不同的通信对象,不同的设计目的和目标而制定出来的.首先要知道这些标准的全称是什么意思 ...
- maven,gradle本地缓存位置
gradle: 配置系统环境变量GRADLE_USER_HOME即可,值为缓存位置. maven: 修改settings文件:maven的home路径下的conf文件夹下的settings.xml 对 ...
- 浅谈一类「AC自动机计数」问题
最近写了几道AC自动机的题.这几题主要考察的是对AC自动机的浅层理解套上计数. 几道计数题 [AC自动机]bzoj3172: [Tjoi2013]单词 把被动贡献看成主动贡献. [状态压缩dp]119 ...
- Python模块(三)(正则,re,模块与包)
1. 正则表达式 匹配字符串 元字符 . 除了换行 \w 数字, 字母, 下划线 \d 数字 \s 空白符 \n 换行符 \t 制表符 \b 单词的边界 \W \D \S 非xxx [ ...
- drf 视图功能
视图 drf提供的视图功能 自己的第一次封装 #一个功能写成一个类,方便组合,只要继承它就可以有这个功能 #将功能都写在一个类中,可控性就会变差 from book.myserializers imp ...
- 中国电信物联网平台入门学习笔记7:NB-IOT信号如何检测
NB-IOT设备会因为信号的原因,数据发不出.但数据发不出的原因有很多,这么排除是NB-IOT信号的问题呢?那就需要NB-IOT信号检测装置. 网上的信号检测设备 作为一个常年蜗居在实验室的穷屌丝而言 ...
- LeetCode(117) Populating Next Right Pointers in Each Node II
题目 Follow up for problem "Populating Next Right Pointers in Each Node". What if the given ...
- Mr. Panda and Crystal HDU - 6007 最短路+完全背包
题目:题目链接 思路:不难看出,合成每个宝石需要消耗一定的魔力值,每个宝石有一定的收益,所以只要我们知道每个宝石合成的最小花费,该题就可以转化为一个背包容量为初始魔力值的完全背包问题,每个宝石的最小花 ...
- try_except__异常处理
try...except.raise 一.try...except 有时候我们写程序的时候,会出现一些错误或异常,导致程序终止.例如,做除法时,除数为0,会引起一个ZeroDivisionError ...