[WC2010][BZOJ1758]重建计划-[二分+分数规划+点分治]
Description
Solution
看到那个式子,显然想到分数规划。。。(不然好难呢)
然后二分答案,则每条边的权值设为g(e)-ans。最后要让路径长度在[L,U]范围内的路径权值>=0
接下来我们就要找路径了。。
考虑树形dp或者分治。
假如是树形dp需要用长链剖分优化。
我的写法是点分治,非常暴力的思路em。就是枚举经过某个点的路径,注意判断长度。mx[i]记录子树内深度为i的点到目前重心的最大权值。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int inf=0x3f3f3f3f;
const double eps=1e-;
int n,L,U,x,y,v;
struct pas{int y,nxt,real_dis;}g[];int h[],tot=; bool vis[]; int sz[],dep[],mx_sz[],S,rt;
void get_rt(int x,int f)
{
sz[x]=;dep[x]=dep[f]+;mx_sz[x]=;
for (int i=h[x];i;i=g[i].nxt)
if (g[i].y!=f&&!vis[g[i].y])
{
get_rt(g[i].y,x),sz[x]+=sz[g[i].y];mx_sz[x]=max(mx_sz[x],sz[g[i].y]);
}
mx_sz[x]=max(mx_sz[x],S-sz[x]);
if (mx_sz[x]<mx_sz[rt]) rt=x;
}
double dis[],mx[];
int fa[];
int q[],dis_q[],l,r;
bool check(int x,double d)
{
int _sz=,u,v;
for (int i=h[x];i;i=g[i].nxt)
{
fa[g[i].y]=x;
l=,r=;q[]=g[i].y;dis[g[i].y]=g[i].real_dis-d;dep[g[i].y]=;
while (l<=r)
{
u=q[l];l++;
if (dep[u]>U) break;
for (int t=h[u];t;t=g[t].nxt)
if (!vis[g[t].y]&&g[t].y!=fa[u])
{
v=g[t].y;
fa[v]=u;
dis[v]=dis[u]+g[t].real_dis-d;
dep[v]=dep[u]+;
if (dep[v]>U) break;
q[++r]=v;
}
}
int re=r,now=_sz;l=,r=;
for (int j=;j<=re;j++)
{
u=q[j];
while (now>=&&dep[u]+now>=L)
{
while (l<=r&&mx[dis_q[r]]<mx[now]) r--;
dis_q[++r]=now;now--;
}
while (l<=r&&dis_q[l]+dep[u]>U) l++;
if (l<=r&&dis[u]+mx[dis_q[l]]>=) return ;
}
for (int t=_sz+;t<=dep[q[re]];t++) mx[t]=-inf;
for (int t=;t<=re;t++) mx[dep[q[t]]]=max(mx[dep[q[t]]],dis[q[t]]);
_sz=max(_sz,dep[q[re]]);
}
return ;
} double lim_l=1e9,lim_r=,ans=;
void solve(int x)
{
rt=;get_rt(x,);vis[rt]=;
double l=lim_l>ans?lim_l:ans,r=lim_r,mid;
while (r-l>eps)
{
mid=(l+r)/;
if (check(rt,mid)) l=mid;else r=mid;
}ans=l;
for (int i=h[rt];i;i=g[i].nxt)
if (!vis[g[i].y]&&sz[g[i].y]>=L)
{
S=sz[g[i].y];solve(g[i].y);
}
}
int main()
{
scanf("%d%d%d",&n,&L,&U);
for (int i=;i<n;i++)
{
scanf("%d%d%d",&x,&y,&v);
g[++tot]=pas{y,h[x],v};h[x]=tot;
g[++tot]=pas{x,h[y],v};h[y]=tot;
lim_l=min(lim_l,(double)v);
lim_r=max(lim_r,(double)v);
}
mx_sz[]=inf;dep[]=-;
S=n;solve();
printf("%.3f",ans);
}
[WC2010][BZOJ1758]重建计划-[二分+分数规划+点分治]的更多相关文章
- BZOJ 1758: [Wc2010]重建计划 01分数规划+点分治+单调队列
code: #include <bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in", ...
- 「WC2010」重建计划(长链剖分/点分治)
「WC2010」重建计划(长链剖分/点分治) 题目描述 有一棵大小为 \(n\) 的树,给定 \(L, R\) ,要求找到一条长度在 \([L, R]\) 的路径,并且路径上边权的平均值最大 \(1 ...
- WC2010 BZOJ1758 重建计划_长链剖分
题目大意: 求长度$\in [L,U]$的路径的最大边权和平均值. 题解 首先二分就不用说了,分数规划大家都懂. 这题有非常显然的点分治做法,但还是借着这个题学一波长链剖分. 其长链剖分本身也没啥,就 ...
- BZOJ1758 WC2010 重建计划 二分答案、点分治、单调队列
传送门 看到平均数最大,自然地想到二分答案.那么我们的$check$函数就是要求:是否存在一条长度在$[L,U]$的路径,满足其权值和$\geq 0$. 看到长度在$[L,U]$,自然地想到点分治求解 ...
- 【BZOJ1758】【WC2010】重建计划(点分治,单调队列)
[BZOJ1758][WC2010]重建计划(点分治,单调队列) 题面 BZOJ 洛谷 Description Input 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表 ...
- BZOJ1758: [Wc2010]重建计划(01分数规划+点分治+单调队列)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1758 01分数规划,所以我们对每个重心进行二分.于是问题转化为Σw[e]-mid>=0, ...
- bzoj 1758 [Wc2010]重建计划 分数规划+树分治单调队列check
[Wc2010]重建计划 Time Limit: 40 Sec Memory Limit: 162 MBSubmit: 4345 Solved: 1054[Submit][Status][Disc ...
- [WC2010]重建计划(分数规划+点分治+单调队列)
题目大意:给定一棵树,求一条长度在L到R的一条路径,使得边权的平均值最大. 题解 树上路径最优化问题,不难想到点分治. 如果没有长度限制,我们可以套上01分数规划的模型,让所有边权减去mid,求一条路 ...
- 【BZOJ 1758】【WC 2010】重建计划 分数规划+点分治+单调队列
一开始看到$\frac{\sum_{}}{\sum_{}}$就想到了01分数规划但最终还是看了题解 二分完后的点分治,只需要维护一个由之前处理过的子树得出的$tb数组$,然后根据遍历每个当前的子树上的 ...
随机推荐
- 【OpenCV】图像增强---灰度变换、直方图均衡化
图像增强的目的:改善图像的视觉效果或使图像更适合于人或机器的分析处理.通过图像增强,可以减少图像噪声,提高目标与背景的对比度,也可以增强或抑制图像中的某些细节. ------------------ ...
- lock与sychronized关键字
1. lock与sychronized关键字的区别 (1) Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,Lock是代码层面的实现.(2 ...
- 坑之OJ-玄学、不可抗力
自家学校OJ网站上的题目,很玄学,不知道哪里出的问题. 这个OJ链接的题目没有问题的. https://www.luogu.org/problemnew/show/P1981 #include < ...
- Unicode字符集和UTF-8, UTF-16, UTF-32编码
ASCII 在过去的计算中,ASCII码被用来表示字符.英语只有26个字母和其他一些特殊字符和符号. 下表提供了ASCII字符及其相应的十进制和十六进制值. 可以从上面的表中推断,在十进制数系统中,A ...
- Apache 各启动方式的差别
apachectl 调用 $httpd -k 1. kill - TERM `cat /usr/local/apache/logs/http.pid` 2. /bin/httpd -k stop/s ...
- Web开发生存工具使用指南
这里安利两款我认为开发中能够极大的提高生产力的工具,Charles 和 Postman. P.S. Charles(查尔斯)..不要再读查理斯了,金刚狼中被老铁扎心的博士就叫 CharlesP.P.S ...
- 各种快速幂(qaq)
今天分享下各种快速幂(有点坑),首先说一下快速幂的原理, 以下以求a的b次方来介绍 [1] 把b转换成二进制数. 该二进制数第i位的权为 例如 11的二进制是1011 11 = 2³×1 + 2 ...
- ABAP术语-Update Task
Update Task 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/20/1114184.html Part of an ABAP pro ...
- Linux 三剑客之sed命令总结
sed ### sed ### .关键字取行 sed -n '/jpinsz/p' test.txt sed -n '/^d/p' test.txt .根据行数取行 sed -n '2,5p' tes ...
- LVM的创建与管理
LVM的创建与管理1.创建物理分区 fdisk 或者 parted 工具分区. LVM分区的类型ID为8e2.创建物理卷 pvcreate 磁盘分区或整个磁盘3.创建卷组 vgcreate 卷组 ...