题目大意:给一棵树,点有点权,将其划分为若干不相交的竖直的链(即链上深度变化单调),一条链的价值是链上点权的极差,问所有链的价值和的最大值。n≤105n\le10^5n≤105
题解:考虑dp[x]表示以x为根的答案,枚举包含x的链的终点。
注意到存在一种最优解一条链上点权单调递增,因此强制a[x],a[y]是链上最大最小/最小最大,并且从x到y的路径点权变化单调,max-min=|a[x]-a[y]|,这个就可以O(1)转移了。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,v) rep(i,0,(int)v.size()-1)
#define lint long long
#define ull unsigned lint
#define db long double
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define gc getchar()
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
typedef pair<int,int> pii;
typedef set<int>::iterator sit;
inline int inn()
{int x,ch;while((ch=gc)<'0'||ch>'9');x=ch^'0';while((ch=gc)>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^'0');return x;
}
const int N=100010;
struct edges{int to,pre;
}e[N<<1];int h[N],etop,a[N];
inline int add_edge(int u,int v) { return e[++etop].to=v,e[etop].pre=h[u],h[u]=etop; }
namespace subtask12{const int N=5010;lint dp[N],tot[N];int calc(int x,int fa,lint cur,lint &v,int mn,int mx){v=max(v,cur+mx-mn);for(int i=h[x],y;i;i=e[i].pre) if((y=e[i].to)^fa)calc(y,x,cur-dp[y]+tot[y],v,min(mn,a[y]),max(mx,a[y]));return 0;}int getdp(int x,int fa=0){for(int i=h[x],y;i;i=e[i].pre)if((y=e[i].to)^fa) getdp(y,x);for(int i=h[x],y;i;i=e[i].pre)if((y=e[i].to)^fa) tot[x]+=dp[y];return calc(x,fa,tot[x],dp[x],a[x],a[x]),0;}inline int brute_force50(int n){rep(i,1,n) tot[i]=dp[i]=0;return getdp(1),!printf("%lld\n",dp[1]);}
}
namespace subtask4{lint tot[N],dp[N],up[N],down[N];int dfs(int x,int fa=0){for(int i=h[x],y;i;i=e[i].pre)if((y=e[i].to)^fa) dfs(y,x),tot[x]+=dp[y];dp[x]=tot[x];for(int i=h[x],y;i;i=e[i].pre)if((y=e[i].to)^fa){if(a[x]<=a[y]) dp[x]=max(dp[x],up[y]-a[x]+tot[x]);else if(a[x]>=a[y]) dp[x]=max(dp[x],a[x]+down[y]+tot[x]);}up[x]=a[x]+tot[x]-dp[x],down[x]=tot[x]-dp[x]-a[x];for(int i=h[x],y;i;i=e[i].pre)if((y=e[i].to)^fa){if(a[x]<=a[y]) up[x]=max(up[x],up[y]+tot[x]-dp[x]);else down[x]=max(down[x],down[y]+tot[x]-dp[x]);}return 0;}inline int acceptable_solution(int n) { return dfs(1),printf("%lld\n",dp[1]),n-n; }
}
int main()
{int n=inn(),x,y;rep(i,1,n) a[i]=inn();rep(i,1,n-1) x=inn(),y=inn(),add_edge(x,y),add_edge(y,x);if(n<=5000) return subtask12::brute_force50(n);return subtask4::acceptable_solution(n);
}

东非大裂谷 - 树dp相关推荐

  1. [BZOJ2125]最短路(圆方树DP)

    题意:仙人掌图最短路. 算法:圆方树DP,$O(n\log n+Q\log n)$ 首先建出仙人掌圆方树(与点双圆方树的区别在于直接连割边,也就是存在圆圆边),然后考虑点u-v的最短路径,显然就是:在 ...

  2. 【BZOJ1040】【codevs1423】骑士,第一次的基环外向树DP

    传送门1 传送门2 思路: 好题 比较简单的DP思路 之前没写过基环树DP,第一次搞真心orz 我们发现这些元素是具有从属关系的 也就是说如果对"厌恶的骑士"两两相互连边,那么问题 ...

  3. 51nod1812树的双直径(换根树DP)

    传送门:http://www.51nod.com/Challenge/Problem.html#!#problemId=1812 题解:头一次写换根树DP. 求两条不相交的直径乘积最大,所以可以这样考 ...

  4. 基环树DP(bzoj 1040: [ZJOI2008]骑士)

    树:n个点n-1条边的连通图 基环树:n个点n条边的连通图,也就是一个环套着多棵树 基环树DP:找到环上任意相邻两点,断掉这两点之间的边,就形成了一棵树 之后对这两点分别进行一次树形DP即可 例题: ...

  5. P1295 [TJOI2011]书架(线段树dp)

    P1295 [TJOI2011]书架(线段树dp) 我好菜 先考虑普通dp: d p i = m i n ( d p j + m a x ( h j + 1 , h j + 2 - , h i ) ) ...

  6. 【BZOJ1124】Mafia(POI2008)-环套树DP

    测试地址:Mafia 做法: 本题需要用到环套树DP. 按照题目构图,很显然是我们很熟悉的环套树森林.接下来我们进行分析,最后活下来一些什么人是合法的呢?观察发现,一个人的目标如果是自己那就必死,而没 ...

  7. 洛谷P2495 [SDOI2011]消耗战(虚树dp)

    P2495 [SDOI2011]消耗战 题目链接 题解: 虚树\(dp\)入门题吧.虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是 ...

  8. 【暖*墟】#动态规划# 基环树DP的学习与练习

    因为弃置了 四边形不等式优化 ,所以DP的任务还剩下 基环树DP / 插头DP / 动态DP 当然,树形DP / 状压DP / 数位DP / 斜率优化DP 也还是要练习的...... 一 . 基环树的 ...

  9. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  10. 【基环树DP】[NOI2012]迷失游乐园

    题目描述 Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多 ...

最新文章

  1. Ruiy自我识人做事领悟录ing
  2. 最优隐神经元数目 算法 matlab,BP算法的改进在Matlab的实现研究
  3. 20165223《网络对抗技术》Exp3 免杀原理与实践
  4. ETL转换工具 kettle——spoon 安装 使用
  5. ADB连接手机的三种方式USB、WLAN、WIFI
  6. JavaScript基础-前端开发
  7. Atitit mvc之道 attilax著 1. Atitti mvc的几大概念 2 1.1. Dispatcher Controller 2 1.2. 声明式渲染 2 1.3. 条件与循环
  8. 浅谈常见浏览器缓存方法(前端缓存)
  9. RuntimeError: CUDA error: invalid device ordinal
  10. 抽象类(abstract)
  11. pandas使用to_feather函数将dataframe保存为feather文件(需要依赖pyarrow包)提升大文件读取效率、pandas使用read_feather函数读取feather文件
  12. 快手2018/9/10
  13. 瑞星微RK3288开发板 (ARM Cortex-A17架构)
  14. 浅谈魔兽世界的BUFF系统和阵营系统
  15. jQuery介绍、jQuery引入
  16. Bootstrap 教程入门
  17. 京津冀计算机学科大学排名,2021京津冀地区民办大学排名前十
  18. ADO.NET是什么
  19. 狼人杀与血染钟楼的【JAVA面向对象】————类和对象
  20. 网络安全实验室--上传关

热门文章

  1. ios中文字添加删除线
  2. PHP 使用fpdf,fpdi类库操作修改pdf文件,添加文字和图片水印,fpdf,fpdi添加中文文字乱码问题
  3. MySQL百万数据插入
  4. 【ps功能精通】6.钢笔工具
  5. 山地车中轴进水表现_解决山地车令人讨厌的中轴异响及其他异响问题
  6. 变限积分求导公式总结_变限积分求导的口诀记忆法及应用
  7. 《第一篇》二进制部署高可用K8S集群v1.24.2及运维(亲测无坑)
  8. 由内而外全面造就自己(三)
  9. Day54.XML解析(DOM4J)、Tomcat服务器、HTML协议简介: 请求、响应报文、响应码
  10. 以贝叶斯思维看待世界