[Bzoj1767][Ceoi2009]harbingers (树上斜率优化)
1767: [Ceoi2009]harbingers
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 451 Solved: 120
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT

分析:
考虑暴力
其中j为i的祖先。
发现很显然的斜率优化式子模型,转化成点斜式

发现x是单增的,可以使用单调栈维护下凸包,答案就是使截矩b最小的点对(x,y)

但发现斜率k是不单调的,代表决策不单调,所以只有采用二分寻找最优决策。
这还是很显然的,但是这道题是在树上,树上根节点到当前点的凸包要在它每个儿子都会使用到,要想办法维护根节点到每个点的凸包。
我们加入一个点后,不从队首开始pop,而是二分寻找它该加入的位置,把那个位置改成当前点,并记录下原来的点和位置。
处理它的所有儿子结点后,又把当前点改回原来的点。这样就做到保存各点凸包信息了。
坑点:会炸long long 比较斜率的时候被迫使用double。
AC代码:
# include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
const int N = 3e5 + ;
typedef long long LL;
int n,dt,head[N],que[N];LL f[N],d[N],v[N],w[N];
struct Edge{
int to,nex;LL w;
}edge[N << ];
void AddEdge(int u,int v,LL w)
{
edge[++dt] = (Edge){v,head[u],w};
head[u] = dt;
}
LL x(int i){return d[i];}
LL y(int i){return f[i];}
LL Get(int A,int B){return f[A] + (d[B] - d[A]) * v[B] + w[B];}
double slope(int A,int B){return ((double)(y(B) - y(A))) / ((double)(x(B) - x(A)));}
bool Cross(int A,int B,int C){return slope(B,C) <= slope(A,B);}
int find(int x,int tp)
{
int l = ,r = tp,ret = ,mid;
while(l <= r)
{
mid = l + r >> ;
if(Get(que[mid],x) < Get(que[mid - ],x))ret = mid,l = mid + ;
else r = mid - ;
}
return ret;
}
int Find(int z,int tp)
{
int l = ,r = tp,ret = tp + ,mid;
while(l <= r)
{
mid = l + r >> ;
if(Cross(que[mid - ],que[mid],z))ret = mid,r = mid - ;
else l = mid + ;
}
return ret;
}
void dfs(int u,int pos,int fa)
{
int qpos,qtop;
f[u] = Get(que[find(u,pos)],u);
qpos = Find(u,pos);qtop = que[qpos];
que[qpos] = u;
for(int i = head[u];i;i = edge[i].nex)
{
if(edge[i].to == fa)continue;
d[edge[i].to] = d[u] + edge[i].w;
dfs(edge[i].to,qpos,u);
}
que[qpos] = qtop;
}
int main(){
scanf("%d",&n);
int x,y,z;
for(int i = ;i < n;i++)
{
scanf("%d %d %d",&x,&y,&z);
AddEdge(x,y,z);AddEdge(y,x,z);
}
for(int i = ;i <= n;i++)scanf("%lld %lld",&w[i],&v[i]);
dfs(,,);printf("%lld",f[]);
for(int i = ;i <= n;i++)printf(" %lld",f[i]);
}
[Bzoj1767][Ceoi2009]harbingers (树上斜率优化)的更多相关文章
- [NOI2014]购票 「树上斜率优化」
首先易得方程,且经过变换有 $$\begin{aligned} f_i &= \min\limits_{dist_i - lim_i \le dist_j} \{f_j + (dist_i - ...
- [洛谷U22158]策划体验(树上斜率优化)(二分最优决策)
题目背景 OL不在,Clao又在肝少*前线,他虽然觉得这个游戏的地图很烦,但是他认为地图的难度还是太低了,习习中作为策划还不够FM,于是他自己YY了一种新的地图和新的机制: 题目描述 整个地图呈树形结 ...
- bzoj1767[Ceoi2009]harbingers 斜率优化dp
1767: [Ceoi2009]harbingers Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 421 Solved: 112[Submit][S ...
- HDU - 59562016ACM/ICPC亚洲区沈阳站I - The Elder 树上斜率优化dp
题意:给定上一棵树,然后每条边有一个权值,然后每个点到 1 的距离有两种,第一种是直接回到1,花费是 dist(1, i)^2,还有另一种是先到另一个点 j,然后两从 j 向1走,当然 j 也可以再向 ...
- BZOJ1767 : [Ceoi2009]harbingers
设d[i]表示i到1的距离 f[i]=w[i]+min(f[j]+(d[i]-d[j])*v[i])=w[i]+d[i]*v[i]+min(-d[j]*v[i]+f[j]) 对这棵树进行点分治,每次递 ...
- 【BZOJ-3672】购票 树分治 + 斜率优化DP
3672: [Noi2014]购票 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1177 Solved: 562[Submit][Status][ ...
- 洛谷 P3994 高速公路(斜率优化)
题目链接 题意:给出一棵树,\(1\) 号点为根,边上有边权. 每个点有两个参数 \(p_i,q_i\) 如果你想从 \(i\) 号点到与其距离为 \(d\) 的 \(j\) 号点,那么你需花费 \( ...
- BZOJ1767/Gym207383I CEOI2009 Harbingers 斜率优化、可持久化单调栈、二分
传送门--BZOJCH 传送门--VJ 注:本题在BZOJ上是权限题,在Gym里面也不能直接看,所以只能在VJ上交了-- 不难考虑到这是一个\(dp\). 设\(dep_x\)表示\(x\)在树上的带 ...
- BZOJ 1767] [Ceoi2009] harbingers (斜率优化)
[BZOJ 1767] [Ceoi2009] harbingers (斜率优化) 题面 给定一颗树,树中每个结点有一个邮递员,每个邮递员要沿着唯一的路径走向capital(1号结点),每到一个城市他可 ...
随机推荐
- laravel模型关联
hasOne 一对一 用户名-手机号hasMany 一对多 文章-评论belongTo 一对多反向 评论-文章belongsToMany 多对多 用户-角色hasManyThrough 远程 ...
- 诊断Java代码中常见的数据库性能热点问题应该这么做!
“你的Java应用程序的性能是怎样诊断和优化的?不妨看看这两位西医的方子.如果你有更好疗效的药方,也欢迎在评论区告诉我们. 当我在帮助一些开发者或架构师分析及优化Java应用程序的性能时,关键往往不在 ...
- JavaScript轮播图
需求: 鼠标移动到下标页码时,也转换到相对应的图片: 多张图片可以自动轮播: 鼠标移动至图片时,停止自动轮播: 可以手动左右调节: <!DOCTYPE html> <html lan ...
- 富通天下(W 笔试)
纸质算法题目 1.给你一个字符串,找出其中第一个只出现过一次的字符及其位置 正解:一层for循环,循环按序取出字符串中的单个字符,循环体内部使用String类的indexOf(),从当前字符下标往后搜 ...
- uva12174 滑动窗口+预处理
注意理解题意,不是排列种类,而是下一个排序出现的时间滑动窗口,具体见代码,写了很多注释(紫书的思路1理解有点麻烦...)注:可以画一个轴来方便理解 #include<iostream> # ...
- iview table 勾选当前行代码 data key _checked: true
给 data 项设置特殊 key _checked: true 可以默认选中当前项
- CAD交互绘制样条线(网页版)
在CAD设计时,需要绘制样条线,用户可以设置样条线线重及颜色等属性. 主要用到函数说明: _DMxDrawX::SendStringToExecuteFun 把命令当着函数执行,可以传参数.详细说明如 ...
- IDEA无法编译源码,IDEA查看源码出现/* compiled code */
打开Settings -> Plugins 搜索dec,选中,确定,重启,解决
- 第1节 flume:8、flume采集某个文件内容到hdfs上
2. 采集文件内容到HDFS 需求分析: 采集需求:比如业务系统使用log4j生成的日志,日志内容不断增加,需要把追加到日志文件中的数据实时采集到hdfs. 同一个日志文件的内容不断增 ...
- git命令使用(三)
git的使用--分支的使用 我们都知道拉取代码的时候,拉下来的是默认的分支,但我们需要的是,其他分支的使用操作 开始,拉取项目 git clone url 查看分支,显示默认分支 git branch ...