/*
树上斜率优化
一开始想的是构造出一个序列
转化成一般的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. XML解析-Dom4j的DOM解析方式更新XML

    Dom4j工具,是非官方的,不在jdk中. 使用步骤: 1)导入dom4j的核心包. dom4j-1.6.1.jar 2)编写Dom4j读取xml文件的代码 1.更新XML 1.1.写出内容到xml文 ...

  2. Cannot resolve symbol R

    最近遇到一个奇怪的问题,在Android build 完版本后,将app 删除后,直接出现 Cannot resolve symbol R , Clean. ReBuild 等试过都没效果. 最终解决 ...

  3. Java 基础入门随笔(2) JavaSE版——关键字、进制转换、类型转换

    1.Java语言-关键字 关键字:被java语言赋予了特殊含义的词,特点是所有的字母都为小写. java涉及到的关键字整理: 用于定义数据类型的关键字 class interface byte sho ...

  4. codeforces_734C_二分

    C. Anton and Making Potions time limit per test 4 seconds memory limit per test 256 megabytes input ...

  5. 5.21leetcode练习

    目录 两数之和 题目 答案 整数反转 题目 思路及答案 回文数 题目 思路及答案 希望每天进步一点点 两数之和 题目 新手司机上路,光荣翻车,没想出来.借了别人的答案,自行领会 答案 整数反转 题目 ...

  6. python 模块学习——time模块

    Python语言中与时间有关的模块主要是:time,datetime,calendar time模块中的大多数函数是调用了所在平台C library的同名函数, 所以要特别注意有些函数是平台相关的,可 ...

  7. Linux cat 命令

    cat命令是linux下的一个文本输出命令,通常是用于观看某个文件的内容的:cat主要有三大功能:1.一次显示整个文件.$ cat   filename2.从键盘创建一个文件.$ cat  >  ...

  8. 图表实现基于SVG或Canvas

    Highcharts 基于SVG,方便自己定制,但图表类型有限. Echarts 基于Canvas,适用于数据量比较大的情况. D3.v3 基于SVG,方便自己定制:D3.v4支持Canvas+SVG ...

  9. iview Table表格单选框互斥

    表格中添加单选框,并且互斥 首先带data中定义   currentid : 0 :表示默认不选中 { title: "名称", key: "name", re ...

  10. 【剑指Offer】66、机器人的运动范围

      题目描述:   地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时 ...