[WC2010]重建计划(长链剖分+线段树+分数规划)
看到平均值一眼分数规划,二分答案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]重建计划(长链剖分+线段树+分数规划)的更多相关文章
- [WC2010]重建计划 长链剖分
[WC2010]重建计划 LG传送门 又一道长链剖分好题. 这题写点分治的人应该比较多吧,但是我太菜了,只会长链剖分. 如果你还不会长链剖分的基本操作,可以看看我的长链剖分总结. 首先一看求平均值最大 ...
- BZOJ.1758.[WC2010]重建计划(分数规划 点分治 单调队列/长链剖分 线段树)
题目链接 BZOJ 洛谷 点分治 单调队列: 二分答案,然后判断是否存在一条长度在\([L,R]\)的路径满足权值和非负.可以点分治. 对于(距当前根节点)深度为\(d\)的一条路径,可以用其它子树深 ...
- 「WC2010」重建计划(长链剖分/点分治)
「WC2010」重建计划(长链剖分/点分治) 题目描述 有一棵大小为 \(n\) 的树,给定 \(L, R\) ,要求找到一条长度在 \([L, R]\) 的路径,并且路径上边权的平均值最大 \(1 ...
- BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP
题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...
- 2019.01.21 bzoj1758: [Wc2010]重建计划(01分数规划+长链剖分+线段树)
传送门 长链剖分好题. 题意简述:给一棵树,问边数在[L,R][L,R][L,R]之间的路径权值和与边数之比的最大值. 思路: 用脚指头想都知道要01分数规划. 考虑怎么checkcheckcheck ...
- 洛谷 P4292 - [WC2010]重建计划(长链剖分+线段树)
题面传送门 我!竟!然!独!立!A!C!了!这!道!题!incredible! 首先看到这类最大化某个分式的题目,可以套路地想到分数规划,考虑二分答案 \(mid\) 并检验是否存在合法的 \(S\) ...
- 2018牛客网暑假ACM多校训练赛(第七场)I Tree Subset Diameter 动态规划 长链剖分 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round7-I.html 题目传送门 - https://www.n ...
- BZOJ.3653.谈笑风生(长链剖分/线段树合并/树状数组)
BZOJ 洛谷 \(Description\) 给定一棵树,每次询问给定\(p,k\),求满足\(p,a\)都是\(b\)的祖先,且\(p,a\)距离不超过\(k\)的三元组\(p,a,b\)个数. ...
- BZOJ.3252.攻略(贪心 长链剖分/线段树)
题目链接 贪心,每次选价值最大的一条到根的链.比较显然(不选白不选). 考虑如何维护这个过程.一个点的价值选了就没有了,而它只会影响它子树里的点,可以用DFS序+线段树修改.而求最大值也可以用线段树. ...
随机推荐
- java内存机制 垃圾回收
gc机制一 1.JVM的gc概述 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc ...
- mysql 中两个日期相减获得 天 小时 分钟 或者 小时:分钟的格式
/**有一个需求,要求获得两个日期想减的天数,小时数,分钟数.通过查找资料,于是乎我写出了如下代码,来获得两个字段.*/ IFNULL(CONCAT( ,'-',''), ),),'天')), ),) ...
- C++中获取当前时间并格式化输出
#include <string> #include <time.h> using namespace std; string getTime() { time_t timep ...
- Comet OJ - Contest #15(B: 当我们同心在一起 )
题目链接 题目描述 平面上有 nn 个坐标相异的点,请问当中有多少组非共线的三个点,这三个点的 外心 也在这 nn 个点之中? 输入描述 第一行有一个正整数 nn 代表平面上的点数. 接下来有 nn ...
- LeetCode做题笔记之动态规划
LeetCode之动态规划 时间有限只做了下面这几道:70.338.877.96.120.95.647,后续会继续更新 70:爬楼梯 先来道简单的练练手,一道经典的动态规划题目 可以采用动态规划的备忘 ...
- Java基础之IO流整理
Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...
- 在linux上部署多个tomcat
1.vim /etc/profile ##########first tomcat########### CATALINA_BASE=/usr/apache-tomcat--fore CATALIN ...
- Go语言之冒泡排序
package main //main函数 import "fmt" //相当于#include func main() { ar := [], , , , , , , , , } ...
- VC++ DLL 1 一点概念
1.在写代码的时候,我们可能会经常要用到一些封装好的函数或者类,这些可能是C/C++的标准库提供的,也可能是由别人开发的非标准库,这个时候就会涉及到动态链接库或者静态链接库的使用了. 举个例子,做图像 ...
- Windows下MariaDB数据搬家问题
背景:公司买了一台服务器要将原来老服务器数据库数据导入新的服务器上,两台服务器环境如下 做好准备后开始实施,老数据库进行停库 找到MariaDB的安装目录下的整data目录进行拷贝,然后到新服务器进行 ...