[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数组$,然后根据遍历每个当前的子树上的 ...
随机推荐
- 【[APIO2008]免费道路】
\(kruskal\)好题 \(0\)边的数量在某些情况下是可以无限制的调控的,前提是所有必须存在的边都在生成树里了 所以应该分别求出有哪些边是必须在生成树里的,我们可以先从大到小排序,求出有哪些\( ...
- selenium + python自动化测试unittest框架学习(四)python导入模块及包知识点
在写脚本的时候,发现导入某些模块,经常报错提示导入模块失败,这里来恶补下python导入模块的知识点. 1.模块导入时文件查找顺序 在脚本中,import xxx模块时的具体步骤: (1)新建一个mo ...
- python文件操作指令
原文地址:http://www.cnblogs.com/rollenholt/archive/2012/04/23/2466179.html 常用的文件操作指令: python中对文件.文件夹(文件操 ...
- windows下搭建nginx+php开发环境
windows下搭建nginx+php开发环境 1.前言 windows下大多我们都是下载使用集成环境,但是本地已经存在一个集成环境,但不适合项目的需求.因此准备再自己搭建一个环境. 2.准备 工具: ...
- VS2012打开Web项目提示《ASP.NET 4.X 尚未在Web服务器上注册。你需要手动将...》解决方案
用VS12创建的WEB项目时,默认使用IIS Experess开发服务器,但是每次打开会提示如下提示 但是同一个项目用VS13或VS15打开时,就能正常打开,不会出现以上提示信息. 怀疑是IIS Ex ...
- linux 编译ffmpeg 支持x264, x265
1. 前言 本教程涉及的ffmpeg, x264, x265 2. 环境依赖 2.1 删除系统中安装的ffmpeg等库 sudo apt-get --purge remove ffmpeg mplay ...
- JavaScript前端将时间戳转换为日期格式
function (data) { var date = new Date(data) var Y = date.getFullYear() + '-' var M = (date.getMonth( ...
- Linux 下让终端走代理的方法
转载: https://blog.fazero.me/2015/09/15/%E8%AE%A9%E7%BB%88%E7%AB%AF%E8%B5%B0%E4%BB%A3%E7%90%86%E7%9A%8 ...
- selenium java maven 自动化测试(二) 页面元素获取与操作
在第一节中,我们已经成功打开了页面,但是自动化测试必然包含了表单的填写与按钮的点击. 所以在第二章中我以博客园为例,完成按钮点击,表单填写 还是以代码为准,先上代码: package com.ryan ...
- js基础(闭包)
1. "闭包就是跨作用域访问变量." [示例一] var name = 'wangxi' function user () { // var name = 'wangxi' fun ...