题目大意:给你一颗$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. 使用dos 作为中介实现cpython 和c# 交互

    最近在使用python 处理一些图形的东西. 实现:对一些512 的图进行像素遍历RGBA 变量, 查询通道不是 255 255 255 颜色 的矩阵,进行切图到空白 之前使用c#进行 确实快10 倍 ...

  2. Oracle 输出树形结构

    Oracle 输出树形结构 树形结构,根 select connect_by_root(cat.parentid) root,cat.id,cat.parentid,cat.name,cat.code ...

  3. 2018.10.18 NOIP训练 [SCOI2018]Pipi 酱的日常(线段树)

    传送门 线段树好题啊. 题目要求的是sum−a−b−c+maxsum-a-b-c+maxsum−a−b−c+max{∣a+v∣+∣b+v∣+∣c+v∣|a+v|+|b+v|+|c+v|∣a+v∣+∣b ...

  4. 2018.07.25 bzoj2125: 最短路(圆方树+倍增)

    传送门 人生的第一道仙人掌. 这道题求是仙人掌上的最短路. 先建出圆方树,然后用倍增跑最短路,当lca" role="presentation" style=" ...

  5. linux CentOS 7 安装 RabbitMQ Erlang 21.0

    1. 安装erlang 安装依赖环境 yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixO ...

  6. python小练习--属性

    箭头这个作业: class Box:#定义一个类名为Box,类名后不必有括号,类包含类属性和类方法,这个类没有定义类属性 '''这是一个计算体积的类'''#这是这个类的__doc__属性,执行类后就可 ...

  7. Windows10和CentOS7双系统安装的一些小技巧

    我个人是先安装好了win10系统,且win10是单独在一个120g的盘里:而centOS7则是安装在另一个500g的磁盘的其中的380g里: 这里要着重注意的是,500g里分成380g的盘不要在win ...

  8. changetoutf-8

    import chardet import os # ANSI文件转UTF-8 import codecs import os def strJudgeCode(str): return charde ...

  9. [翻译]Spring MVC RESTFul Web Service CRUD 例子

    Spring MVC RESTFul Web Service CRUD 例子 本文主要翻译自:http://memorynotfound.com/spring-mvc-restful-web-serv ...

  10. java线程一

    我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread).线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可能和其他线程共享一些资源,比 ...