原题: http://acm.hdu.edu.cn/showproblem.php?pid=5956

题意:

给出一棵树,根为1,边权,从1出发,一次可以走多条路,每次的花费为L2L^2L2,LLL为路径长度。除了第一次外,都需要加上PPP。(比如说1,2,2,11,2,2,11,2,2,1,你先(1+2)2(1+2)^2(1+2)2,再PPP,再(2+1)2(2+1)^2(2+1)2)

求所有点到1的最小距离的最大值。

解析:

显然是树形dp+斜率优化,一眼题。

dp[i]=dp[j]+P+(sumi−sumj)2dp[i]=dp[j]+P+(sum_i-sum_j)^2dp[i]=dp[j]+P+(sumi​−sumj​)2(jjj是iii的祖先,sumisum_isumi​代表点iii到根的路径长)

这个式子写出来后没想到斜率优化的可以罚站了。

推式子,假设yyy是xxx的子孙,yyy优于xxx,有:
dp[y]+P+(sumi−sumy)2&lt;dp[x]+P+(sumi−sumx)2dp[y]+P+(sum_i-sum_y)^2&lt;dp[x]+P+(sum_i-sum_x)^2dp[y]+P+(sumi​−sumy​)2<dp[x]+P+(sumi​−sumx​)2 dp[y]+sumy2−dp[x]−sumx2sumy−sumx&lt;2sumi\dfrac{dp[y]+sum^2_y-dp[x]-sum^2_x}{sum_y-sum_x}&lt;2sum_isumy​−sumx​dp[y]+sumy2​−dp[x]−sumx2​​<2sumi​

正确性验证: sumi↑sum_i\uparrowsumi​↑,小于号,斜率栈单调增


有了式子,再来想一个问题,树上怎么斜率优化?

难题1:怎么在做右儿子的时候,消除左儿子留下的dp状态

显然时间点大于fafafa的状态都无效,所以我们可以赋予每个状态一个时间戳,做右儿子的时候弹出尾部的时间戳大于fafafa的状态。

难题2:做左儿子的时候把fafafa以及上面的状态弹出

我们只需要先存下这些状态,搜索结束后还原即可。考虑出入顺序,可以使用栈来存储。

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pill pair<int,int>
const int maxn=100009;
LL n,p;int head[maxn],nex[maxn<<1],to[maxn<<1],now;LL val[maxn<<1];
void add(int a,int b,LL v){nex[++now]=head[a];head[a]=now;to[now]=b;val[now]=v;
}LL sum[maxn];
pill S[maxn];
int l,r;
LL dp[maxn];inline long double K(int x,int y){return (long double)(dp[y]+sum[y]*sum[y]-dp[x]-sum[x]*sum[x])/(long double)(sum[y]-sum[x]);
}int tim;stack <pill>F,E;void dfs(int pos,int fa){int L=0,R=0;int NOW=++tim;if(pos>1){while(r>l&&K(S[l].first,S[l+1].first)<=(long double)(2*sum[pos]))l++,F.push(S[l-1]),L++;int FROM=S[l].first;dp[pos]=dp[FROM]+p+(sum[pos]-sum[FROM])*(sum[pos]-sum[FROM]);while(r>l&&K(S[r-1].first,S[r].first)>=K(S[r].first,pos))r--,E.push(S[r+1]),R++;S[++r]={pos,NOW};}for(int i=head[pos];i;i=nex[i]){while(r>=l&&S[r].second>NOW)r--;if(to[i]==fa)continue;sum[to[i]]=sum[pos]+val[i];dfs(to[i],pos);}r--;while(L--)S[--l]=F.top(),F.pop();while(R--)S[++r]=E.top(),E.pop();
}int main(){int t;scanf("%d",&t);while(t--){now=tim=0;memset(head,0,sizeof head);scanf("%lld%lld",&n,&p);rep(i,1,n-1){int a,b;LL v;scanf("%d%d%lld",&a,&b,&v);add(a,b,v);add(b,a,v);}sum[1]=0;dp[1]=-p;l=r=1;S[1]={1,1};dfs(1,0);LL ans=0;rep(i,2,n)ans=max(ans,dp[i]);printf("%lld\n",ans);}
}

The Elder(树形dp 斜率优化)相关推荐

  1. P3994 高速公路 树形DP+斜率优化+二分

    $ \color{#0066ff}{ 题目描述 }$ C国拥有一张四通八达的高速公路网树,其中有n个城市,城市之间由一共n-1条高速公路连接.除了首都1号城市,每个城市都有一家本地的客运公司,可以发车 ...

  2. BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )

    既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...

  3. BZOJ 3156: 防御准备( dp + 斜率优化 )

    dp(i)表示处理完[i,n]且i是放守卫塔的最小费用. dp(i) = min{dp(j) + (j-i)(j-i-1)/2}+costi(i<j≤N) 然后斜率优化 ------------ ...

  4. 【BZOJ-3156】防御准备 DP + 斜率优化

    3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 951  Solved: 446 [Submit][Status][Discus ...

  5. [HNOI2008]玩具装箱toy(dp+斜率优化)

    斜率优化问题一般都是决策单调问题.对于这题能够证明单调决策. 令sum[i]=sigma(c [k] ) 1<=k<=i  ,  f[i]=sum[i]+i ,  c=L+1; 首先我们能 ...

  6. UVAlive 6131 dp+斜率优化

    这道题和06年论文<从一类单调性问题看算法的优化>第一道例题很相似. 题意:给出n个矿的重量和位置,这些矿石只能从上往下运送,现在要在这些地方建造m个heap,要使得,sigma距离*重量 ...

  7. hdu 3507 Print Article(dp+斜率优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题解:显然这题的递推很容易得到 dp[i]=dp[j]+(sum[i]-sum[j])^2+m ...

  8. C++剑指offer:解题报告之DP优化学习记 (二) ——浅论DP斜率优化 (Print Article 【HDU - 3507】 )

    链接:https://share.weiyun.com/5LzbzAc 目录 前言 斜率优化前期准备 1.从状态转移方程出发 2.推理状态转移方程 对结论的进一步推导 干货!综合结论 判断斜率大小的方 ...

  9. FZU - 2302  Necklace (dp+斜率优化)

    I - Necklace FZU - 2302 题目大意:给出一个环每一段的价值为区间和的平方,求将环断成k断的最小价值之和. 解题思路:容易想到n^4的dp 首先断环成链,将数组复制一遍. 用dp[ ...

  10. CDOJ 879 摩天轮 dp+斜率优化

    原题链接:http://www.acm.uestc.edu.cn/#/problem/show/879 题意: 中文题 题解: 这是一道斜率dp的题. 先把$a$数组排个序. 令$dp[i][j]$表 ...

最新文章

  1. 服务差,信号不好真的是联通用户下滑的原因吗?
  2. java extend 和 implements 的区别
  3. JZOJ 3.10 1540——岛屿
  4. 【推荐】Web 2.0 必读经典 !
  5. 通过修改然后commit的方式创建自己的镜像
  6. 【poj题集整理】【存下来并不会看】
  7. weakhashmap_Java WeakHashMap size()方法与示例
  8. deepinu盘制作工具_用U盘装系统,试试这款多系统启动盘制作工具!
  9. java 中文数字排序_java 中文数字排序方法
  10. 怎么制作真人qq秀_真人秀---搏击赛事新风向标的机与忧
  11. rufus 制作U盘启动工具
  12. 电力系统三相短路计算机计算报告,电力系统分析三相短路计算习题.doc
  13. 鸿蒙系统如何设置字体,图解鸿蒙OS独特的字体系统!
  14. 训练3.21(C:Summer Dichotomy)
  15. 基于arduino、ros手柄控制机械臂
  16. 烤仔观察 | 从 KuCoin 被盗聊起,盘一盘那些年我们丢过的币
  17. 金域医学:规模+技术,ICL领军者迈入新篇章
  18. C# 里面的 #region 是什么意思 以及partial 作用
  19. Ubuntu 18.10 cosmic换源
  20. Vs code快捷键及常用插件

热门文章

  1. java左移和右移_java 位运算 之 左移和右移理解
  2. 好用的图形工具yEd Graph Editor
  3. FS32R294JCK0MJDT功能、FS32R294KCK0MJDT特点、FS32R294KAK0MJDT雷达微控制器
  4. ECMAScript和JavaScript的区别
  5. sumifs函数的使用方法,sumifs函数的多条件运用
  6. 故障排除经验——笔记本电脑重启后键盘失灵的解决办法(亲测可用)
  7. C# 通过UDP 远程监控摄像头
  8. 简单彩虹动画的效果实现
  9. 发明专利授权:顺源科技模拟信号隔离放大及转换技术
  10. 国外知名广告联盟平台