/*
树上斜率优化
一开始想的是构造出一个序列
转化成一般的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. JS——“==”与“===”

    ==: 两个等于号只是比较两个变量的值 var n1 = 1; var n2 = "1"; alert(n1 == n2);//返回true ===: 三个等于号不仅比较值而且比较 ...

  2. 3星|《腾讯产业森林:AI时代的创业密码》:后半部分是较详细的创业指南,前面泛泛介绍腾讯、AI

    腾讯产业森林:AI时代的创业密码 前半部分泛泛介绍腾讯对创业者的支持,腾讯支持的创业项目的案例.AI的一些基本介绍,后半部分是比较详细的写给创业者的各阶段行动与选择的指南. 总体评价3星,有一些参考价 ...

  3. Linux基础之网络协议

    互联网通信原理 从物理层面来说,每台计算机在一开始都是彼此孤立的,为了实现信息的交流与共享,计算机之间必须要建立通信网络.例如人与人之间的交流,他们必须要共用一套语言系统,才能交流成功.计算机之间也是 ...

  4. 怎么选择最适合自己的Linux培训机构?

    Linux培训已经成为入门Linux的一个重要途径,它的优势在于学习知识的系统性.快速性和实用性.Linux培训毕业的学员大多数拥有较强的实战动手能力,能够较快上手,更符合企业需求. 不过,大部分同学 ...

  5. EasyUI, Dialog 在框架页(ifrmae)的Top页面弹出时,拖拽Dialog边缘(以改变窗口大小),UI界面被卡死的解决办法

    将Dialog的modal属性设置为true,可以解决卡死的问题(但会给用户使用体验带来影响) var par = { title: This.title, width: This.width, he ...

  6. / Vijos / 题库 /1250 / 最勇敢的机器人

    / Vijos / 题库 /1250 / 最勇敢的机器人 借鉴博客:http://www.cnblogs.com/chty/p/5830516.html 背景 Wind设计了很多机器人.但是它们都认为 ...

  7. Heaters (codeforces 1066B)

    贪心题 策略 在最左边设置一个array 0,每一次从右往左,如果有heater的话就寻找heater左边界是不是小于等于目前的上一个heater的右边界,如果没有一个这样的,那么就直接输出-1 代码 ...

  8. Redis防护建议

    1.Redis本身防护  (1)不要使用默认端口(6379)  (2)增加Redis用户名和密码  (3)在Redis绑定指定IP访问(位置配置文件[redis.config]中的bind节点)2.L ...

  9. 【codeforces 764D】Timofey and rectangles

    [题目链接]:http://codeforces.com/contest/764/problem/D [题意] 给你n个矩形,以左下角坐标和右上角坐标的形式给出; (保证矩形的边长为奇数) 问你有没有 ...

  10. Java_集合总结

    集合分类 Collection 接口是集合的父类 1.Set 集合 使用内部的排列机制(无序),存入集合的顺序和取出集合的顺序不一致,没有索引,存入集合的元素没有重复 HashSet集合 Linked ...