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]重建计划-[二分+分数规划+点分治]的更多相关文章

  1. BZOJ 1758: [Wc2010]重建计划 01分数规划+点分治+单调队列

    code: #include <bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in", ...

  2. 「WC2010」重建计划(长链剖分/点分治)

    「WC2010」重建计划(长链剖分/点分治) 题目描述 有一棵大小为 \(n\) 的树,给定 \(L, R\) ,要求找到一条长度在 \([L, R]\) 的路径,并且路径上边权的平均值最大 \(1 ...

  3. WC2010 BZOJ1758 重建计划_长链剖分

    题目大意: 求长度$\in [L,U]$的路径的最大边权和平均值. 题解 首先二分就不用说了,分数规划大家都懂. 这题有非常显然的点分治做法,但还是借着这个题学一波长链剖分. 其长链剖分本身也没啥,就 ...

  4. BZOJ1758 WC2010 重建计划 二分答案、点分治、单调队列

    传送门 看到平均数最大,自然地想到二分答案.那么我们的$check$函数就是要求:是否存在一条长度在$[L,U]$的路径,满足其权值和$\geq 0$. 看到长度在$[L,U]$,自然地想到点分治求解 ...

  5. 【BZOJ1758】【WC2010】重建计划(点分治,单调队列)

    [BZOJ1758][WC2010]重建计划(点分治,单调队列) 题面 BZOJ 洛谷 Description Input 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表 ...

  6. BZOJ1758: [Wc2010]重建计划(01分数规划+点分治+单调队列)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1758 01分数规划,所以我们对每个重心进行二分.于是问题转化为Σw[e]-mid>=0, ...

  7. bzoj 1758 [Wc2010]重建计划 分数规划+树分治单调队列check

    [Wc2010]重建计划 Time Limit: 40 Sec  Memory Limit: 162 MBSubmit: 4345  Solved: 1054[Submit][Status][Disc ...

  8. [WC2010]重建计划(分数规划+点分治+单调队列)

    题目大意:给定一棵树,求一条长度在L到R的一条路径,使得边权的平均值最大. 题解 树上路径最优化问题,不难想到点分治. 如果没有长度限制,我们可以套上01分数规划的模型,让所有边权减去mid,求一条路 ...

  9. 【BZOJ 1758】【WC 2010】重建计划 分数规划+点分治+单调队列

    一开始看到$\frac{\sum_{}}{\sum_{}}$就想到了01分数规划但最终还是看了题解 二分完后的点分治,只需要维护一个由之前处理过的子树得出的$tb数组$,然后根据遍历每个当前的子树上的 ...

随机推荐

  1. python选课系统

    程序名称: 选课系统 角色:学校.学员.课程.讲师 要求: 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海 ...

  2. Yahoo!团队经验:网站性能优化的34条黄金法则

    英文原文:http://developer.yahoo.com/performance/rules.html 1.尽量减少HTTP请求次数 (1)合并文件就是通过把所有的脚本放到一个文件中来减少HTT ...

  3. Server Host Cannot be null解决方法

    在用打开Services Directory application 或者访问 某个已发布的地图服务时,出现"Server Host Cannot be null"的错误. 问题的 ...

  4. C/C++ 格式化读取和读取一行

    文件内容 23 21 4 1 1 0 114 1 1 1 8 112 5 0 0 0 114 1 0 0 0 115 52 4 1 0 1 134 4 0 1 12 131 4 1 1 0 133 5 ...

  5. IO流操作详解

    注:FileReader继承InputStreamReader类,InputStreamReader实现Reader接口,其他同理. 对于文件内容的操作主要分为两大类 分别是: 字符流 字节流 其中, ...

  6. background-clip 实现字体渐变效果

    background-clip 实现字体渐变效果 (一)类似KTV字幕效果 @-webkit-keyframes loop{ 0%{background-position: -800px 0;} 10 ...

  7. 3.C++和C混合编程

    最近经常看到头文件中有 #ifdef __cplusplus extern "C" { #endif ....... #ifdef __cplusplus } #endif 这样的 ...

  8. Win32多线程之核心对象

    CreateThread()传回两个值,用以识别一个新的线程.第一个值是个Handle,  这也是CreateThread()的返回值,大部分与线程有关的API函数都需要它.第二个值是由lpThrea ...

  9. 《Android应用测试与调试实战》读书笔记

    一 本书概述 自动化测试篇:Android应用可以使用Java语言配合SDK,也可以使用HTML5技术,还可以用C/C++语言配合NDK技术编写,本书中涵盖了针对这三种技术编写的应用所采用的测试技术. ...

  10. HDU 1007 Quoit Design(经典最近点对问题)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...