题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=1767

题解:
斜率优化DP,单调栈,二分

定义 DP[i] 表示从 i 节点出发,到达根所花的最少时间。
同时既然是一棵树,那么裸的转移还是比较容易想出来的。
$DP[i]=min(DP[j]+(dis_i-dis_j)V_i)+W_i (j是i到根的链上的节点)$
$\quad=min(DP[j]-dis_j*V_i)+dis_i*V_i+W_i$
其中 dis[i] 表示 i 节点到根的距离。
转移方程的意思就是i号点的邮递员走到j号点,然后j号点的邮递员继续走向根。


考虑优化:
假设对于当前计算的DP[i],有两个转移来源点:k,j,同时dis[k]<dis[j],设j点比k点优。
那么有:$DP[j]-dis_j*V_i-(DP[k]-dis_k*V_i)<0$
则: $\frac{DP[j]-DP[k]}{dis[j]-dis[k]}<V[i]$
如果令 Slope(j,k)=$\frac{DP[j]-DP[k]}{dis[j]-dis[k]}$
那么得到结论,如果 dis[k]<dis[j],且Slope(j,k)<V[i]的话,则j点优于k点。
同时如果存在三个转移来源点:k,j,i,满足dis[k]<dis[j]<dis[i],
同时Slope(i,j)<Slope(j,k),则j点无效。
所以对于每个来源点二元组(dis[j],DP[j]),只需要在平面上维护一个下凸壳即可。


值得注意的地方:

1).注意到DP时是在DFS遍历树时进行,所以这就保证了dis的单调递增,
但是V[i]却不单调,所以要用单调栈一个下凸壳,并在其中二分最优转移来源点。
2).由于是在树上进行,所以从某个节点回溯之后,要把当时它插入单调栈时造成的影响消除。
具体做法是:
进入该节点时(已经计算出其DP值)
二分当前点应该在单调栈中插入的位置p,记录该位置之前的信息以及栈顶位置,
然后直接把该点放在p位置,并将栈顶移到p位置。
离开该节点时,再把之前修改的东西全部复原(还原单调栈中p位置的信息,还原栈顶位置)。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 100050
#define ll long long
using namespace std;
ll W[MAXN],V[MAXN],DP[MAXN],dis[MAXN];
int N;
struct Edge{
int to[MAXN*2],val[MAXN*2],nxt[MAXN*2],head[MAXN],ent;
Edge(){ent=2;}
void Adde(int u,int v,int w){
to[ent]=v; val[ent]=w; nxt[ent]=head[u]; head[u]=ent++;
to[ent]=u; val[ent]=w; nxt[ent]=head[v]; head[v]=ent++;
}
}E;
struct Mostk{
int s[MAXN],top;
#define Slope(i,j) (1.0*(DP[i]-DP[j])/(dis[i]-dis[j]))
void Reset(){top=0;}
int Find(int i){
static int l,r,mid,ret;
l=2; r=top; ret=top+1;
if(top&&dis[i]==dis[s[top]])
{if(DP[i]<DP[s[top]]) ret=top,r--; else return 0;}
while(l<=r){
mid=(l+r)>>1;
if(Slope(i,s[mid])<Slope(s[mid],s[mid-1])) ret=mid,r=mid-1;
else l=mid+1;
}
return ret;
}
int Query(int i){
static int l,r,mid,ret;
l=2; r=top; ret=1;
while(l<=r){
mid=(l+r)>>1;
if(Slope(s[mid],s[mid-1])>V[i]) r=mid-1;
else ret=mid,l=mid+1;
}
return s[ret];
}
}S;
void DFS(int u,int fa){
int p,oldp,oldsp,oldtop;
oldp=p=S.Find(u);
if(p) oldsp=S.s[p],S.s[p]=u,oldtop=S.top,S.top=p;
for(int i=E.head[u];i;i=E.nxt[i]){
int v=E.to[i]; if(v==fa) continue;
dis[v]=dis[u]+E.val[i];
p=S.Query(v);
DP[v]=DP[p]+(dis[v]-dis[p])*V[v]+W[v];
DFS(v,u);
}
if(oldp) S.s[oldp]=oldsp; S.top=oldtop;
}
int main(){
scanf("%d",&N);
for(int i=1,u,v,w;i<N;i++){
scanf("%d%d%d",&u,&v,&w);
E.Adde(u,v,w);
}
for(int i=2;i<=N;i++)
scanf("%lld%lld",&W[i],&V[i]);
S.Reset();
DFS(1,0);
for(int i=2;i<=N;i++)
printf(i<N?"%lld ":"%lld",DP[i]);
return 0;
}

  

●BZOJ 1767 [Ceoi2009]harbingers的更多相关文章

  1. BZOJ 1767] [Ceoi2009] harbingers (斜率优化)

    [BZOJ 1767] [Ceoi2009] harbingers (斜率优化) 题面 给定一颗树,树中每个结点有一个邮递员,每个邮递员要沿着唯一的路径走向capital(1号结点),每到一个城市他可 ...

  2. bzoj 1767: [Ceoi2009]harbingers

    Description 给定一颗树,树中每个结点有一个邮递员,每个邮递员要沿着唯一的路径走向capital(1号结点),每到一个城市他可以有两种选择: 1.继续走到下个城市 2.让这个城市的邮递员替他 ...

  3. bzoj1767[Ceoi2009]harbingers 斜率优化dp

    1767: [Ceoi2009]harbingers Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 421  Solved: 112[Submit][S ...

  4. [Bzoj1767][Ceoi2009]harbingers (树上斜率优化)

    1767: [Ceoi2009]harbingers Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 451  Solved: 120[Submit][S ...

  5. BZOJ1767/Gym207383I CEOI2009 Harbingers 斜率优化、可持久化单调栈、二分

    传送门--BZOJCH 传送门--VJ 注:本题在BZOJ上是权限题,在Gym里面也不能直接看,所以只能在VJ上交了-- 不难考虑到这是一个\(dp\). 设\(dep_x\)表示\(x\)在树上的带 ...

  6. 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]) 对这棵树进行点分治,每次递 ...

  7. ●BZOJ 3672 [Noi2014]购票

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3672 题解: 斜率优化DP,点分治(树上CDQ分治...) 这里有一个没有距离限制的简单版: ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. DP 优化方法大杂烩 & 做题记录 I.

    标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 ...

随机推荐

  1. 使用Putty连接Amazon EC2 Instance

    Amazon的EC2中,默认是不允许使用用户名和密码直接连接Instance的,而是通过AWS (Amazon Web Service)提供的证书.在第一次使用EC2的时候,AWS会要求你创建一个证书 ...

  2. img加载卡顿,解决办法

    我觉得我在这个项目里遇到了太多的第一次.比如上一篇博文:在在360.UC等浏览器,img不加载原因. 当前情况是:图片加载缓慢,图片加载时出现卡顿. 上图:我缩放了图片,估计有点变形.能说明情况就行, ...

  3. selenium在页面中多个fream的定位

    在做页面元素定位的时候,遇到多fream的页面定位比较困难,需要先去切换到元素所在的fream才能成功定位. 1,切换到目标fream: driver.switch_to.frame('freamID ...

  4. restful架构风格设计准则(三)资源识别和资源设计

    读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! restful风格的设计中,首先要识别系统中的资源,然后用HTTP规范表 ...

  5. Docker学习笔记 - Docker的简介

    传统硬件虚拟化:虚拟硬件,事先分配资源,在虚拟的硬件上安装操作系统,虚拟机启动起来以后资源就会被完全占用. 操作系统虚拟化:docker是操作系统虚拟化,借助操作系统内核特性(命名空间.cgroups ...

  6. Spring Security入门(3-2)Spring Security对接用户的权限系统

    源文链接,多谢作者的分享: http://www.360doc.com/content/14/0727/16/18637323_397445724.shtml 1.原生的spring-security ...

  7. KNN算法简单应用

    这里是写给小白看的,大牛路过勿喷. 1 KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集 ...

  8. LINGO 基础学习笔记

    LINGO 中建立的优化模型可以由5个部分组成,或称为 5 段(section): (1)集合段(SETS):这部分要以"SETS:"开始,以"ENDSETS" ...

  9. Stanford依存句法关系解释

    ROOT:要处理文本的语句 IP:简单从句 NP:名词短语 VP:动词短语 PU:断句符,通常是句号.问号.感叹号等标点符号 LCP:方位词短语 PP:介词短语 CP:由'的'构成的表示修饰性关系的短 ...

  10. 前端 jQuery

    一.jQuery是什么? <1>jQuery由美国人John Resig创建,至今已吸引了来自世界各地众多JavaScript高手加入其team. <2>jQuery是继pro ...