状态转移方程很好想

写出来发现是经典的斜率优化

由于状态本质上是在树链上转移, 所以回溯的时候要撤销状态

分析了一下单调队列可能不太好做,所以直接二分了

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> PA;
const int maxn = 1e5 + 10;
int T, N, P;
vector<PA> G[maxn];
LL dis[maxn], dp[maxn], l, r, que[maxn];
inline LL F(int idx) { return dp[idx] + dis[idx]*dis[idx]; }
void dfs1(int f, int u, LL d) {dis[u] = d;for (int i = 0; i < G[u].size(); i++) {int v = G[u][i].first, cost = G[u][i].second;if (v == f) continue;dfs1(u, v, d+cost);}
}
bool judge(int x, LL t) { return F(que[x])-F(que[x-1]) <= t*(dis[que[x]]-dis[que[x-1]]); }
int solve(LL t) {int x = l+1, y = r;while (x <= y) {int mid = (x + y)/2;if (judge(mid, t)) x = mid + 1;else y = mid - 1;}return y;
}
void dfs2(int f, int u) {if (l > r) dp[u] = dis[u]*dis[u];else {int x = que[solve(2LL*dis[u])];dp[u] = min(dis[u]*dis[u], dp[x]+(dis[u]-dis[x])*(dis[u]-dis[x])+P);}while (l < r && (F(que[r])-F(que[r-1]))*(dis[u]-dis[que[r]]) >= (F(u)-F(que[r]))*(dis[que[r]]-dis[que[r-1]])) r--;que[++r] = u;for (int i = 0; i < G[u].size(); i++) {int v = G[u][i].first;if (v == f) continue;dfs2(u, v);}if (que[r] == u) r--;
}
int main() {scanf("%d", &T);while (T--) {scanf("%d%d", &N, &P);for (int i = 1; i <= N; i++) G[i].clear();for (int i = 1; i <= N-1; i++) {int u, v, cost; scanf("%d%d%d", &u, &v, &cost);G[u].push_back(PA(v, cost));G[v].push_back(PA(u, cost));}dfs1(0, 1, 0);l = 1, r = 0;dfs2(0, 1);LL ans = 0;for (int i = 2; i <= N; i++) ans = max(ans, dp[i]);printf("%lld\n", ans);}return 0;
}

HDU - 5956 The Elder——斜率优化dp相关推荐

  1. HDU 2993 MAX Average Problem(斜率优化DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...

  2. HDU 3507 Print Article(斜率优化DP)

    题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...

  3. 逊哥dp专题 总结(普通dp,斜率优化dp,数位dp)

    dp真是博大精深,本渣自叹智商不足,但是就算是不足也要拼死一搏,怒燃之 poj 3934 题意:给你n个身高都不同的人,然后排队,如果两人之间的所有人都比他们俩矮,那么他们俩可以互相看见,问你如果要正 ...

  4. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

  5. CF-311B Cats Transport(斜率优化DP)

    题目链接 题目描述 小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员. 农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号. 第 \(i\) 座山与第 ...

  6. 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)

    点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...

  7. HDU-3507Print Article 斜率优化DP

    学习:https://blog.csdn.net/bill_yang_2016/article/details/54667902 HDU-3507 题意:有若干个单词,每个单词有一个费用,连续的单词组 ...

  8. APIO2010 特别行动队 斜率优化DP算法笔记

    做完此题之后 自己应该算是真正理解了斜率优化DP 根据状态转移方程$f[i]=max(f[j]+ax^2+bx+c),x=sum[i]-sum[j]$ 可以变形为 $f[i]=max((a*sum[j ...

  9. YBTOJ洛谷P3195:玩具装箱(斜率优化dp)

    传送门 文章目录 前言 解析 代码 前言 斜率优化dp,就是利用斜率优化的dp (逃) 解析 第一道斜优的题 分析题目 设sumisum_isumi​为1-i的c的前缀和 容易写出dp转移式: dpi ...

  10. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 11893  Solved: 5061 [Submit] ...

最新文章

  1. 涂抹功能_贴片面膜、水洗面膜、涂抹面膜这三款怎么选?
  2. luogu P1843 奶牛晒衣服 | 二分法
  3. 【Android CPU 优化】Android CPU 调优 ( Trace 文件分析 | Android Profiler 工具 | CPU Profiler 工具 )
  4. 鼓浪屿天气预报软件测试,厦门鼓浪屿天气预报15天
  5. 第一章:nginx环境搭建
  6. JDK9新特性实战:简化流关闭新姿势
  7. professional中文_Microsoft office 2007 简体中文版
  8. 七岁OpenStack热情不减 如此执着为哪般?
  9. linux测试硬盘的ipos,Linux/Unix平台data-recovery常用的工具
  10. 对话中国AI先锋,生态科技岛首秀深圳
  11. pcl 使用gpu计算法向量_PCL点云特征描述与提取(1)
  12. c语言搜索算法伪代码,FFT算法伪代码
  13. 牛逼程序员职业提升必看的书
  14. http client的英文文档 牛逼
  15. FFmpeg 录制桌面、麦克风、摄像头
  16. 企业微信hook接口,协议开发,群操作功能教程
  17. 方法详解(命名规则)
  18. 为什么要配置数据源ODBC
  19. 在android安卓模拟器BlueStacks蓝手指上使用微信摇一摇
  20. 自动上色论文《Deep Exemplar-based Colorization》(2)

热门文章

  1. Hbuilder封装APP教程
  2. Jquery各种插件下载
  3. mysql数据库技术思考题5_Mysql课后思考题
  4. php 正则不贪婪,正则表达式之 贪婪与非贪婪模式详解(概述)
  5. python exec 返回值_Python exec()用法及代码示例
  6. GraphPad Prism使用
  7. Ecmascript 6
  8. Snaker的回退流程源码分析
  9. 将进酒:写在26岁生日这一天
  10. 芒果改进YOLOv7系列:首发改进特征融合网络BiFPN结构,融合更多有效特征