/*
树上斜率优化
一开始想的是构造出一个序列
转化成一般的dp但是可能被卡
扫把状的树的话可能变成n*n
其实可以直接在树上维护这个单调队列
dfs虽然搞得是一棵树,但是每次都是dfs到的都是一个序列
虽然题目说的是从节点到1号 但是我们从1到节点也是一样搞
关键是dfs回溯的时候怎么把改掉的序列改回去
比如当前是u 队列里面从hea到tai 我们搞到v1
搞v1的时候 会从队首扔掉几个斜率小的 到时回溯回来的时候
hea 和tai 是随着状态存到栈里的 问题不大 q不变不影响
但是 把v1扔进去的时候 会可能先把队尾扔几个 这就问题大了有点慌
因为我们后面要用到这些东西
倘若我们记下队尾的元素 搞完子树的事情再弄回去
便好了
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 100010
#define ll long long
using namespace std;
int T,n,p,num,head[maxn],q[maxn];
ll s[maxn],ans,f[maxn];
struct node{
int v,t,pre;
}e[maxn*];
void Add(int from,int to,int dis){
num++;e[num].v=to;
e[num].t=dis;
e[num].pre=head[from];
head[from]=num;
}
void dfs(int now,int from,ll dis){
s[now]=dis;
for(int i=head[now];i;i=e[i].pre){
int v=e[i].v;if(v==from)continue;
dfs(v,now,dis+e[i].t);
}
}
ll X(int i){
return s[i];
}
ll Y(int i){
return f[i]+s[i]*s[i];
}
ll Dx(int i,int j){
return X(i)-X(j);
}
ll Dy(int i,int j){
return Y(i)-Y(j);
}
void Dfs(int now,int from,int hea,int tai){
int pre=-;
if(now!=){
while(hea+<tai&&Dy(q[hea+],q[hea+])<=*s[now]*Dx(q[hea+],q[hea+]))hea++;
int j=q[hea+];f[now]=min(f[now],f[j]+(s[now]-s[j])*(s[now]-s[j])+p);
while(hea+<tai&&Dy(now,q[tai])*Dx(q[tai],q[tai-])<=Dy(q[tai],q[tai-])*Dx(now,q[tai]))tai--;
pre=q[++tai];q[tai]=now;
}
ans=max(ans,f[now]);
for(int i=head[now];i;i=e[i].pre){
int v=e[i].v;if(v==from)continue;
Dfs(v,now,hea,tai);
}
if(pre!=-)q[tai]=pre;
}
int main(){
scanf("%d",&T);
while(T--){
num=;ans=;
memset(head,,sizeof(head));
memset(q,,sizeof(q));
scanf("%d%d",&n,&p);
int u,v,t;
for(int i=;i<n;i++){
scanf("%d%d%d",&u,&v,&t);
Add(u,v,t);Add(v,u,t);
}
dfs(,,);
for(int i=;i<=n;i++)
f[i]=s[i]*s[i];
Dfs(,,,);
printf("%lld\n",ans);
}
return ;
}

The Elder HDU - 5956的更多相关文章

  1. ACM-ICPC 2016 沈阳赛区现场赛 I. The Elder && HDU 5956(斜率DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5956 题意:一颗树上每条边有个权值,每个节点都有新闻要送到根节点就是1节点,运送过程中如果不换青蛙就是 ...

  2. hdu 5956 The Elder

    http://acm.hdu.edu.cn/showproblem.php?pid=5956 转移方程:dp[i]=(dis[i]-dis[j])*(dis[i]-dis[j])+P+dp[j] 斜率 ...

  3. HDU 5956 The Elder (树上斜率DP)

    题意:给定上一棵树,然后每条边有一个权值,然后每个点到 1 的距离有两种,第一种是直接回到1,花费是 dist(1, i)^2,还有另一种是先到另一个点 j,然后两从 j 向1走,当然 j 也可以再向 ...

  4. DP的优化总结

    一.预备知识 \(tD/eD\) 问题:状态 t 维,决策 e 维.时间复杂度\(O(n^{e+t})\). 四边形不等式: 称代价函数 w 满足凸四边形不等式,当:\(w(a,c)+w(b,d)\l ...

  5. ACM里的期望和概率问题 从入门到精通

    起因:在2020年一场HDU多校赛上.有这么一题没做出来. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6829 题目大意:有三个人,他们分别有X,Y ...

  6. HDU - 59562016ACM/ICPC亚洲区沈阳站I - The Elder 树上斜率优化dp

    题意:给定上一棵树,然后每条边有一个权值,然后每个点到 1 的距离有两种,第一种是直接回到1,花费是 dist(1, i)^2,还有另一种是先到另一个点 j,然后两从 j 向1走,当然 j 也可以再向 ...

  7. hdu 1301 Jungle Roads 最小生成树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301 The Head Elder of the tropical island of Lagrish ...

  8. HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  9. HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

随机推荐

  1. fresh_bank、、

    最近新学习了一个bank系统来和大家分享一下,新人求罩! 破索式之_链子枪_ 废话不多说了直接本主题 如果我们要写出bank系统,就要先考虑这个问题:总共需要几个类? 既然是银行系统,那么必不可少的就 ...

  2. drupal 8——打补丁(patch)

    druapl 的核心可能会有漏洞,这时就需要我们去打补丁.很多补丁都已经有人写好了,我这里讲的就是如何去打这些已经写好的补丁. 对于这个问题:drupal8 核心有bug导致了两个相同的错误提示的出现 ...

  3. 删除过期备份报错RMAN-06207 RMAN-06208解决方案

    RMAN备份日志中出现了警告 日志文件目录如下: [root@erpdbs rmanback]# ll total 88 -rw-r--r-- 1 oraprod dba 81011 Sep 7 22 ...

  4. 清瘦的记录者: 一个比dbutils更小巧、好用的的持久化工具

    https://gitee.com/bitprince/memory 1. 概述 1.1 连接.语句和结果集 从JDBC的规范上看,其对数据访问层有相当简洁的抽象:1.连接(connection) 2 ...

  5. html5——web字体

    基本介绍 1.自定义网页特殊字体,无需考虑用户电脑上是否安装了此特殊字体,从此把特殊字体处理成图片的时代便成为了过去. 2.支持程度比较好,甚至IE低版本浏览器也能支持. 3.web字体的大小鉴定是字 ...

  6. iOS crash log 解析 symbol address = stack address - slide 运行时获取slide的api 利用dwarfdump从dsym文件中得到symbol

    概述: 为什么 crash log 内 Exception Backtrace 部分的地址(stack address)不能从 dsym 文件中查出对应的代码? 因为 ASLR(Address spa ...

  7. Python 之类型转换

    # int(x[, base]) 将x转换为一个整数,base为进制,默认十进制 # # long(x[, base] ) 将x转换为一个长整数 # # float(x) 将x转换到一个浮点数 # # ...

  8. 浅谈jQuery宽高及其应用

    [前言] 今天讲了讲jQuery各种元素宽高的获取和设置,下面简单总结下,希望对各位小伙伴有所帮助 [主体] 补充知识点: (1)width()返回结果无单位,css("width" ...

  9. 安装部署NetBeans mysql Tomact joget workflow 环境

    一.安装joget workflow 1.安装jdk 下载jdk http://www.oracle.com/technetwork/java/javase/downloads/index.html ...

  10. c/c++排坑(4) -- c/c++中返回局部变量

    返回c语言中的局部变量 先看一段代码猜猜,打印值: #include <iostream> using namespace std; char * func(); int main() { ...