题目大意:给你一颗$n$个点的有根树,相邻两个点之间有距离,我们可以从$x$乘车到$x$的祖先,费用为$dis\times P[x]+Q[x]$,问你除根以外每个点到根的最小花费。

数据范围:$n≤10^6$。

此题我们显然$dp$,列出方程为$f[x]=min\{f[y]+dis(x,y)\times P[x]+Q[x]\}$,其中$y$为$x$的祖先。

不难看出可能是一个斜率优化的式子,我们往下推推

设$i$是$j$的祖先,且从$i$出转移比从$j$处转移劣,不难列出:

$f[i]+dis(i,x)P[x]+Q[x]>f[j]+dis(j,x)P[x]+Q[x]$

化简化简,令$D_i$表示从根到$i$的距离,继续移项化简

$f[i]-f[j]>P[x]((D_x-D_j)-(D_x-D_i))$

$f[i]-f[j]>P[x](D_i-D_j)$

$\dfrac{f[i]-f[j]}{D_i-D_j}<P[x]$(注意大于符号变成小于,因为$D_i<D_j$,重要!,我被坑了)

考虑到$P$随着点深度递增,于是就可以快乐斜率优化了。

不过这题需要在树上转移,当遍历完一个子树后,我们要把单调队列恢复,恢复操作显然可以用可持久化线段树来搞。

其实不用这么复杂,考虑到只存在移动队头,移动队尾&在队尾加一个数的操作,我们只需要记录下以前的队头/尾的情况,还有被覆盖的数原先是啥,就可以在常数时间内恢复回去。

然而这么做的话无法保证移动队头尾的次数是线性的(我们搞一个链+链底菊花树),所以在找队头和队尾时,需要用二分。

于是时间复杂度就变成$O(n\log\ n)$了,二分的常数很小,问题不大。

(我比较懒写了暴力移动的,二分的话自己脑补吧qwq)

 #include<bits/stdc++.h>
#define M 1000005
#define L long long
using namespace std; struct edge{L u,v,next;}e[M]={}; L head[M]={},use=;
void add(L x,L y,L z){use++;e[use].u=y;e[use].v=z;e[use].next=head[x];head[x]=use;}
L n,f[M]={},P[M]={},Q[M]={},dis[M]={},q[M]={},h=,t=; double slope(L i,L j){return .*(f[i]-f[j])/(dis[i]-dis[j]);} void dfs(L x,L D){
L H=h,T=t;
while(h<t&&P[x]>slope(q[h],q[h+])) h++;
f[x]=f[q[h]]+((dis[x]=D)-dis[q[h]])*P[x]+Q[x];
while(h<t&&slope(q[t-],q[t])>slope(q[t],x)) t--;
L lastT=q[++t]; q[t]=x;
for(L i=head[x];i;i=e[i].next) dfs(e[i].u,D+e[i].v);
q[t]=lastT; h=H; t=T;
} main(){
scanf("%lld",&n);
for(L i=;i<=n;i++){
L fa,dis; scanf("%lld%lld%lld%lld",&fa,&dis,P+i,Q+i);
add(fa,i,dis);
}
q[t=]=; for(L i=head[];i;i=e[i].next) dfs(e[i].u,e[i].v);
for(L i=;i<=n;i++) printf("%lld\n",f[i]);
}

【洛谷p3994】Highway 二分+斜率优化DP的更多相关文章

  1. 洛谷 P4072 [SDOI2016]征途 斜率优化DP

    洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...

  2. 洛谷 P3994 高速公路(斜率优化)

    题目链接 题意:给出一棵树,\(1\) 号点为根,边上有边权. 每个点有两个参数 \(p_i,q_i\) 如果你想从 \(i\) 号点到与其距离为 \(d\) 的 \(j\) 号点,那么你需花费 \( ...

  3. 洛谷P3994 Highway(树形DP+斜率优化+可持久化线段树/二分)

    有点类似NOI2014购票 首先有方程$f(i)=min\{f(j)+(dep_i-dep_j)*p_i+q_i\}$ 这个显然是可以斜率优化的... $\frac {f(j)-f(k)}{dep_j ...

  4. UOJ#7 NOI2014 购票 点分治+凸包二分 斜率优化DP

    [NOI2014]购票 链接:http://uoj.ac/problem/7 因为太麻烦了,而且暴露了我很多学习不扎实的问题,所以记录一下具体做法. 主要算法:点分治+凸包优化斜率DP. 因为$q_i ...

  5. Codeforces Round #344 (Div. 2) E. Product Sum 二分斜率优化DP

    E. Product Sum   Blake is the boss of Kris, however, this doesn't spoil their friendship. They often ...

  6. SCUT - 365 - 鹏哥的数字集合 - wqs二分 - 斜率优化dp

    https://scut.online/p/365 https://www.luogu.org/problemnew/solution/P2365 写这篇的时候还不是很明白,看一下这个东西. http ...

  7. 洛谷P2365 任务安排(斜率优化dp)

    传送门 思路: 最朴素的dp式子很好考虑:设\(dp(i,j)\)表示前\(i\)个任务,共\(j\)批的最小代价. 那么转移方程就有: \[ dp(i,j)=min\{dp(k,j-1)+(sumT ...

  8. 洛谷P2120 [ZJOI2007]仓库建设 斜率优化DP

    做的第一道斜率优化\(DP\)QwQ 原题链接1/原题链接2 首先考虑\(O(n^2)\)的做法:设\(f[i]\)表示在\(i\)处建仓库的最小费用,则有转移方程: \(f[i]=min\{f[j] ...

  9. 2018.08.28 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化dp)

    传送门 一道斜率优化dp入门题. 是这样的没错... 我们用dis[i]表示i到第三个锯木厂的距离,sum[i]表示前i棵树的总重量,w[i]为第i棵树的重量,于是发现如果令第一个锯木厂地址为i,第二 ...

随机推荐

  1. js实现a_b变成A B的两种方法

    1.var key = 'a_b'; var a = key.replace(/\b.|_./g, function (i) { if (i.length === 2) { i = ' ' + i[1 ...

  2. ViewFlipper实现自动播放的图片库

    作者实现的基础上,加上了文字的变换 public class MainActivity extends Activity { private ViewFlipper viewFlipper; priv ...

  3. 前端程序员经常忽视的一个 JavaScript 面试题

    题目 function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function () { ...

  4. 用Git将项目发布在GitHub里

    转载自http://blog.csdn.net/u011572517/article/details/50537407,个人加了一些注意事项和解释. githud是一个程序员以后成长都会使用到的,先不 ...

  5. TableView编辑状态下跳转页面的崩溃处理

    29down votefavorite 12 I have a viewController with a UITableView, the rows of which I allow to edit ...

  6. Nvidia显卡驱动下载

    https://www.nvidia.cn/Download/index.aspx?lang=cn https://blog.csdn.net/weixin_39643690/article/deta ...

  7. 【最大流之ek算法】HDU1532 求最大流

    本来是继续加强最短路的训练,但是遇到了一个最短路 + 最大流的问题,最大流什么鬼,昨天+今天学习了一下,应该对ek算法有所了解,凭借学习后的印象,自己完成并ac了这个最大流的模板题 题目大意:都是图论 ...

  8. 设计模式之组合模式(Composite Pattern)

    一.什么是组合模式? 组合模式提供了一种层级结构,并允许我们忽略对象与对象集合之间的差别 调用者并不知道手里的东西是一个对象还是一组对象,不过没关系,在组合模式中,调用者本来就不需要知道这些 二.举个 ...

  9. 理解go语言 协程之间的通讯

    go已经越来越被重视了,特别适合大型互联网公司基础服务的编写,高效,高并发,可以同时允许多个明星出轨,多个明星结婚 都不在话下,下面介绍下GO协程通讯的过程 直接上代码 package main im ...

  10. asp.net core 使用identityServer4的密码模式来进行身份认证(一)

    IdentityServer4是ASP.NET Core的一个包含OpenID和OAuth 2.0协议的框架.具体Oauth 2.0和openId请百度. 前言本博文适用于前后端分离或者为移动产品来后 ...