The Elder(树形dp 斜率优化)
原题: 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<dp[x]+P+(sumi−sumx)2dp[y]+P+(sum_i-sum_y)^2<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<2sumi\dfrac{dp[y]+sum^2_y-dp[x]-sum^2_x}{sum_y-sum_x}<2sum_isumy−sumxdp[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 斜率优化)相关推荐
- P3994 高速公路 树形DP+斜率优化+二分
$ \color{#0066ff}{ 题目描述 }$ C国拥有一张四通八达的高速公路网树,其中有n个城市,城市之间由一共n-1条高速公路连接.除了首都1号城市,每个城市都有一家本地的客运公司,可以发车 ...
- BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )
既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...
- BZOJ 3156: 防御准备( dp + 斜率优化 )
dp(i)表示处理完[i,n]且i是放守卫塔的最小费用. dp(i) = min{dp(j) + (j-i)(j-i-1)/2}+costi(i<j≤N) 然后斜率优化 ------------ ...
- 【BZOJ-3156】防御准备 DP + 斜率优化
3156: 防御准备 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 951 Solved: 446 [Submit][Status][Discus ...
- [HNOI2008]玩具装箱toy(dp+斜率优化)
斜率优化问题一般都是决策单调问题.对于这题能够证明单调决策. 令sum[i]=sigma(c [k] ) 1<=k<=i , f[i]=sum[i]+i , c=L+1; 首先我们能 ...
- UVAlive 6131 dp+斜率优化
这道题和06年论文<从一类单调性问题看算法的优化>第一道例题很相似. 题意:给出n个矿的重量和位置,这些矿石只能从上往下运送,现在要在这些地方建造m个heap,要使得,sigma距离*重量 ...
- hdu 3507 Print Article(dp+斜率优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题解:显然这题的递推很容易得到 dp[i]=dp[j]+(sum[i]-sum[j])^2+m ...
- C++剑指offer:解题报告之DP优化学习记 (二) ——浅论DP斜率优化 (Print Article 【HDU - 3507】 )
链接:https://share.weiyun.com/5LzbzAc 目录 前言 斜率优化前期准备 1.从状态转移方程出发 2.推理状态转移方程 对结论的进一步推导 干货!综合结论 判断斜率大小的方 ...
- FZU - 2302 Necklace (dp+斜率优化)
I - Necklace FZU - 2302 题目大意:给出一个环每一段的价值为区间和的平方,求将环断成k断的最小价值之和. 解题思路:容易想到n^4的dp 首先断环成链,将数组复制一遍. 用dp[ ...
- CDOJ 879 摩天轮 dp+斜率优化
原题链接:http://www.acm.uestc.edu.cn/#/problem/show/879 题意: 中文题 题解: 这是一道斜率dp的题. 先把$a$数组排个序. 令$dp[i][j]$表 ...
最新文章
- 服务差,信号不好真的是联通用户下滑的原因吗?
- java extend 和 implements 的区别
- JZOJ 3.10 1540——岛屿
- 【推荐】Web 2.0 必读经典 !
- 通过修改然后commit的方式创建自己的镜像
- 【poj题集整理】【存下来并不会看】
- weakhashmap_Java WeakHashMap size()方法与示例
- deepinu盘制作工具_用U盘装系统,试试这款多系统启动盘制作工具!
- java 中文数字排序_java 中文数字排序方法
- 怎么制作真人qq秀_真人秀---搏击赛事新风向标的机与忧
- rufus 制作U盘启动工具
- 电力系统三相短路计算机计算报告,电力系统分析三相短路计算习题.doc
- 鸿蒙系统如何设置字体,图解鸿蒙OS独特的字体系统!
- 训练3.21(C:Summer Dichotomy)
- 基于arduino、ros手柄控制机械臂
- 烤仔观察 | 从 KuCoin 被盗聊起,盘一盘那些年我们丢过的币
- 金域医学:规模+技术,ICL领军者迈入新篇章
- C# 里面的 #region 是什么意思 以及partial 作用
- Ubuntu 18.10 cosmic换源
- Vs code快捷键及常用插件