看到平均值一眼分数规划,二分答案mid,边权变为w[i]-mid,看是否有长度在[L,R]的正权路径。设f[i][j]表示以i为根向下j步最长路径,用长链剖分可以优化到O(1),查询答案线段树即可,复杂度O(nlog2n)

不知为什么bzoj上RE,luogu上AC,暂时不管了。

#include<bits/stdc++.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
const int N=2e5+;
int n,L,R,cnt,tot,hd[N],v[N],nxt[N],w[N],son[N],sv[N],dep[N],dfn[N];
double mid,ans,s[N<<],val[N],f[N];
void add(int x,int y,int z){v[++tot]=y,nxt[tot]=hd[x],w[tot]=z,hd[x]=tot;}
void dfs1(int u,int fa)
{
for(int i=hd[u];i;i=nxt[i])
if(v[i]!=fa)
{
dfs1(v[i],u);
if(dep[v[i]]>=dep[son[u]])son[u]=v[i],sv[u]=w[i];
if(dep[v[i]]+>dep[u])dep[u]=dep[v[i]]+;
}
}
void dfs2(int u,int fa)
{
dfn[u]=++cnt;
if(son[u])dfs2(son[u],u);
for(int i=hd[u];i;i=nxt[i])if(v[i]!=fa&&v[i]!=son[u])dfs2(v[i],u);
}
void update(int k,double v,int l,int r,int rt)
{
if(l==r){s[rt]=max(s[rt],v);return;}
int mid=l+r>>;
if(k<=mid)update(k,v,lson);else update(k,v,rson);
s[rt]=max(s[rt<<],s[rt<<|]);
}
double query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)return s[rt];
int mid=l+r>>;double ret=-2e9;
if(L<=mid)ret=max(ret,query(L,R,lson));
if(R>mid)ret=max(ret,query(L,R,rson));
return ret;
}
void dfs(int u,int fa)
{
int id=dfn[u];
if(son[u])dfs(son[u],u),val[id]=val[id+]+sv[u]-mid;
update(id,f[id]=-val[id],,n,);
if(dep[u]>=L)
{
double tmp=query(id+L,id+min(dep[u],R),,n,);
ans=max(ans,tmp+val[id]);
}
for(int i=hd[u];i;i=nxt[i])
if(v[i]!=fa&&v[i]!=son[u])
{
int idv=dfn[v[i]];
dfs(v[i],u);
for(int j=;j<=dep[v[i]];j++)
{
int l=id+max(,L-j-),r=id+min(dep[u],R-j-);
double tmp=query(l,r,,n,);
ans=max(ans,tmp+val[idv]+val[id]+f[idv+j]+w[i]-mid);
}
for(int j=;j<=dep[v[i]];++j)
{
double tmp=val[idv]+f[idv+j]+w[i]-mid-val[id];
if(tmp>f[id+j+])update(id+j+,f[id+j+]=tmp,,n,);
}
}
}
bool check()
{
for(int i=;i<(N<<);i++)s[i]=-2e9;
ans=-2e9,dfs(,);
return ans>=1e-;
}
int main()
{
scanf("%d%d%d",&n,&L,&R);
for(int i=,x,y,z;i<n;i++)scanf("%d%d%d",&x,&y,&z),add(x,y,z),add(y,x,z);
dfs1(,),dfs2(,);
double l=,r=1e6;
while(r-l>1e-)
{
mid=(l+r)/;
if(check())l=mid;else r=mid;
}
printf("%.3lf",l);
}

[WC2010]重建计划(长链剖分+线段树+分数规划)的更多相关文章

  1. [WC2010]重建计划 长链剖分

    [WC2010]重建计划 LG传送门 又一道长链剖分好题. 这题写点分治的人应该比较多吧,但是我太菜了,只会长链剖分. 如果你还不会长链剖分的基本操作,可以看看我的长链剖分总结. 首先一看求平均值最大 ...

  2. BZOJ.1758.[WC2010]重建计划(分数规划 点分治 单调队列/长链剖分 线段树)

    题目链接 BZOJ 洛谷 点分治 单调队列: 二分答案,然后判断是否存在一条长度在\([L,R]\)的路径满足权值和非负.可以点分治. 对于(距当前根节点)深度为\(d\)的一条路径,可以用其它子树深 ...

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

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

  4. BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP

    题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...

  5. 2019.01.21 bzoj1758: [Wc2010]重建计划(01分数规划+长链剖分+线段树)

    传送门 长链剖分好题. 题意简述:给一棵树,问边数在[L,R][L,R][L,R]之间的路径权值和与边数之比的最大值. 思路: 用脚指头想都知道要01分数规划. 考虑怎么checkcheckcheck ...

  6. 洛谷 P4292 - [WC2010]重建计划(长链剖分+线段树)

    题面传送门 我!竟!然!独!立!A!C!了!这!道!题!incredible! 首先看到这类最大化某个分式的题目,可以套路地想到分数规划,考虑二分答案 \(mid\) 并检验是否存在合法的 \(S\) ...

  7. 2018牛客网暑假ACM多校训练赛(第七场)I Tree Subset Diameter 动态规划 长链剖分 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round7-I.html 题目传送门 -  https://www.n ...

  8. BZOJ.3653.谈笑风生(长链剖分/线段树合并/树状数组)

    BZOJ 洛谷 \(Description\) 给定一棵树,每次询问给定\(p,k\),求满足\(p,a\)都是\(b\)的祖先,且\(p,a\)距离不超过\(k\)的三元组\(p,a,b\)个数. ...

  9. BZOJ.3252.攻略(贪心 长链剖分/线段树)

    题目链接 贪心,每次选价值最大的一条到根的链.比较显然(不选白不选). 考虑如何维护这个过程.一个点的价值选了就没有了,而它只会影响它子树里的点,可以用DFS序+线段树修改.而求最大值也可以用线段树. ...

随机推荐

  1. HTML笔记及案例

    - 了解什么是标记语言 - 了解HTML主要特性,主要变化以及发展趋势 - 了解HTML的结构标签 - 掌握HTML的主要标签(字体,图片,列表,链接,表单等标签) ### 1.网站信息页面 #### ...

  2. Java enum应用小结

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  3. Maven工程配置依赖

    1.下载 安装 官网下载maven :http://maven.apache.org/download.cgi ,下载时候注意版本,IDEA旧版本如我用的2017在安装Maven时可能会报错,此时别下 ...

  4. 吴裕雄--天生自然 JAVASCRIPT开发学习:字符串

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. Ubuntu系统下QEMU环境搭建

    (这篇文章是在搭建QEMU环境时,在网上找到了一些教程资料,并在实际操作中遇到的一些问题的整理) 下载Linux内核 下载内核有两种方法,一种是用git直接下载内核代码树,方便后面的内核开发.另一种是 ...

  6. 201712-2 游戏 Java

    思路: 第一感觉有点像约瑟夫环.想到用队列解决比较好理解 import java.util.LinkedList; import java.util.Queue; import java.util.S ...

  7. C/C++学习笔记-gcc动态库及静态库

    gcc工作流程 1.预处理 gcc -E 2.编译 gcc -S 3.汇编 gcc -c 4.链接 没参数制作静态库: 1.命名规则:libMyName.a2.制作步骤: ①.生成.o gcc -c ...

  8. 吴裕雄--天生自然MySQL学习笔记:MySQL 连接的使用

    使用 MySQL 的 JOIN 在两个或多个表中查询数据. 可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询. JOIN 按照功能大致分为如 ...

  9. A - Shortest path of the king (棋盘)

    The king is left alone on the chessboard. In spite of this loneliness, he doesn't lose heart, becaus ...

  10. php开启opcache

    OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销. 一.php.ini配置opchche ...