[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数组$,然后根据遍历每个当前的子树上的 ...
随机推荐
- POJ - 3476 A Game with Colored Balls---优先队列+链表(用数组模拟)
题目链接: https://cn.vjudge.net/problem/POJ-3476 题目大意: 一串长度为N的彩球,编号为1-N,每个球的颜色为R,G,B,给出它们的颜色,然后进行如下操作: 每 ...
- C/C++读取一行
C语言 1. char buf[80]={0}; gets(buf); //可以读取空格, 回车结束输入 2. char buf[10] = {0}; scanf("%[^\n] ...
- Js 中的 this
Js 中 this 的理解 this 是啥 ? this是 JavaScript 语言的一个关键字,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用; 随着函数使用场合的不同,this ...
- 5、Spring-Cloud-声明式调用 Feign(上)
5.1.写一个 Feign 害户端 新建项目: 依赖: <dependency> <groupId>org.springframework.boot</groupId&g ...
- 理解java的三大特性之多态
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个 ...
- ERDAS IMAGINE 2014 32位 破解安装
1. 安装Install ERDAS Foundation 2014 2. 安装ERDAS IMAGINE 2014 32位 3. 安装Intergraph ...
- Python KafkaProducer and KafkaConsumer的开发模块
1.在python中往kakfa写数据和读取数据,使用的是python-kafka库 2.消费者需持续写入数据,因groupid存在偏移量,才能看看到数据. 3.安装库的命令为pip install ...
- first-child伪类选择器
原文链接地址:https://www.cnblogs.com/wangmeijian/p/4562304.html :first-child 选择器用于选取属于其父元素的首个子元素的指定选择器.——w ...
- iOS之LLDB调试器
LLDB被定位为下一代的高性能调试器,默认内置于Xcode IDE内, 支持在PC.iOS设备以及模拟器上调试C.Objective-C和C++. 关于LLDB的官方介绍:LLDB 常用命令: 1. ...
- vue面试题!!!
由于公司需要,需要把项目拆分,前端使用vue框架.最近面试vue总结的试题 1:mvvm框架是什么?它和其他框架的区别是什么? mvvm 全称model view viewModel,model数据模 ...