[BZOJ1758][WC2010]重建计划(点分治+单调队列)
点分治,对于每个分治中心,考虑求出经过它的符合长度条件的链的最大权值和。
从分治中心dfs下去取出所有链,为了防止两条链属于同一个子树,我们一个子树一个子树地处理。
用s1[i]记录目前分治中心伸下去的链中长度为i的链的最大权值,s2[i]记录新子树中的链的最大权值。
分数规划,考虑合并,枚举长度,由于另一个长度在一个滑动窗口中,所以使用单调队列求解即可。
为了保证复杂度,讲子树按高度排序。注意初始化等问题。
#include<cstdio>
#include<vector>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
using namespace std; const int N=;
const double eps=1e-,inf=1e9;
bool vis[N];
int n,L,R,u,v,w,S,rt,tot,sz[N],f[N],he[N],d[N],q[N];
int cnt,h[N],pre[N],to[N<<],val[N<<],nxt[N<<];
double ans,dis[N],s1[N],s2[N];
vector<int>ve;
void add(int u,int v,int w){ to[++cnt]=v; val[cnt]=w; nxt[cnt]=h[u]; h[u]=cnt; } bool cmp(int a,int b){ return he[a]<he[b]; } void get(int x,int fa){
sz[x]=; f[x]=;
For(i,x) if ((k=to[i])!=fa && !vis[k])
get(k,x),f[x]=max(f[x],sz[k]),sz[x]+=sz[k];
f[x]=max(f[x],S-sz[x]);
if (f[x]<f[rt]) rt=x;
} void dfs(int x,int fa){
d[x]=d[fa]+; he[x]=;
For(i,x) if ((k=to[i])!=fa && !vis[k])
pre[k]=val[i],dfs(k,x),he[x]=max(he[x],he[k]+);
} void dfs2(int x,int fa,double mid){
dis[x]=dis[fa]+pre[x]-mid; s2[d[x]]=max(s2[d[x]],dis[x]);
For(i,x) if ((k=to[i])!=fa && !vis[k]) dfs2(k,x,mid);
} bool jud(double mid){
double res=-inf;
rep(i,,tot){
int k=ve[i],st=,ed=; dis[rt]=;
rep(j,,he[k]) s2[j]=-inf; dfs2(k,rt,mid);
rep(j,,he[k]){
if (st<=ed && q[st]>R-j) st++;
if (L-j<=he[k]){
while (st<=ed && s1[q[ed]]<s1[L-j]) ed--;
q[++ed]=L-j;
}
if (st<=ed) res=max(res,s1[q[st]]+s2[j]);
}
rep(j,,he[k]) s1[j]=max(s1[j],s2[j]);
}
return res>;
} void solve(int x){
vis[x]=; d[]=-; dfs(x,); dis[x]=; ve.clear();
For(i,x) if (!vis[k=to[i]]) ve.push_back(k=to[i]);
tot=ve.size()-;
if (tot==-) return;
sort(ve.begin(),ve.end(),cmp);
int ed=he[ve[tot]];
double L=ans,R=1e6;
while (L+eps<R){
double mid=(L+R)/;
rep(i,,ed) s1[i]=-inf; s1[]=;
if (jud(mid)) L=mid; else R=mid;
}
ans=max(ans,L);
For(i,x) if (!vis[k=to[i]]) rt=,S=sz[k],get(k,x),solve(rt);
} int main(){
freopen("bzoj1758.in","r",stdin);
freopen("bzoj1758.out","w",stdout);
scanf("%d%d%d",&n,&L,&R);
rep(i,,n) scanf("%d%d%d",&u,&v,&w),add(u,v,w),add(v,u,w);
f[]=n+; S=n; rt=; get(,);
solve(rt); printf("%.3lf\n",ans);
return ;
}
[BZOJ1758][WC2010]重建计划(点分治+单调队列)的更多相关文章
- P4292 [WC2010]重建计划 点分治+单调队列
题目描述 题目传送门 分析 看到比值的形式就想到 \(01分数规划\),二分答案 设当前的值为 \(mids\) 如果存在\(\frac{\sum _{e \in S} v(e)}{|S|} \geq ...
- BZOJ1758: [Wc2010]重建计划
题解: 这题我居然做了一星期?... 平均值的极值其实也可以算是一种分数规划,只不过分母上b[i]=1 然后我们就可以二分这个值.类似与 HNOI最小圈 如果没有 链的长度的限制的话,我们直接两遍df ...
- BZOJ1758 WC2010 重建计划 二分答案、点分治、单调队列
传送门 看到平均数最大,自然地想到二分答案.那么我们的$check$函数就是要求:是否存在一条长度在$[L,U]$的路径,满足其权值和$\geq 0$. 看到长度在$[L,U]$,自然地想到点分治求解 ...
- BZOJ1758: [Wc2010]重建计划(01分数规划+点分治+单调队列)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1758 01分数规划,所以我们对每个重心进行二分.于是问题转化为Σw[e]-mid>=0, ...
- 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, ...
- 2019.01.21 bzoj1758: [Wc2010]重建计划(01分数规划+长链剖分+线段树)
传送门 长链剖分好题. 题意简述:给一棵树,问边数在[L,R][L,R][L,R]之间的路径权值和与边数之比的最大值. 思路: 用脚指头想都知道要01分数规划. 考虑怎么checkcheckcheck ...
- bzoj 1758 [Wc2010]重建计划 分数规划+树分治单调队列check
[Wc2010]重建计划 Time Limit: 40 Sec Memory Limit: 162 MBSubmit: 4345 Solved: 1054[Submit][Status][Disc ...
- BZOJ.1758.[WC2010]重建计划(分数规划 点分治 单调队列/长链剖分 线段树)
题目链接 BZOJ 洛谷 点分治 单调队列: 二分答案,然后判断是否存在一条长度在\([L,R]\)的路径满足权值和非负.可以点分治. 对于(距当前根节点)深度为\(d\)的一条路径,可以用其它子树深 ...
随机推荐
- 20165230 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
20165230 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: 指 ...
- 利用正则表达式去除所有html标签,只保留文字
后台将富文本编辑器中的内容返回到前端时如果带上了标签,这时就可以利用这种方法只保留文字. 标签的格式有以下几种 1.<div class="test"></div ...
- 【网页开发学习】Coursera课程《面向 Web 开发者的 HTML、CSS 与 Javascript》Week1课堂笔记
Coursera课程<面向 Web 开发者的 HTML.CSS 与 Javascript> Johns Hopkins University Yaakov Chaikin Week1 In ...
- aarch64_l4
livestreamer-1.12.2-7.fc26.noarch.rpm 2017-02-11 17:38 537K fedora Mirroring Project lizardfs-adm-3. ...
- .NET 4.5 Task异步编程学习资料
参考资料: 1. http://www.cnblogs.com/heyuquan/archive/2013/04/18/3028044.html
- 数据库-mysql视图
视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用 一:创建视图 create view view ...
- CRF条件随机场
CRF的进化 https://flystarhe.github.io/2016/07/13/hmm-memm-crf/参考: http://blog.echen.me/2012/01/03/intro ...
- js中的盒子模型
说到盒子模型,你第一时间会想到css盒子模型,css中的盒子模型包括(内容区+内边距+边框).那在js中怎么去获取这些属性值呢?下面一起来学习js中的盒子模型. css样式 body { margin ...
- UVA 10891 Game of Sum(区间DP(记忆化搜索))
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- sublime text配置make工具
sublime text配置make工具 Linux下许多项目是用makefile来管理的,是用gcc+make等方式来编译和运行. 在只有tty的场合或年代,使用vim或emacs是不二选择:但在L ...