/*
树上斜率优化
一开始想的是构造出一个序列
转化成一般的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. [ USACO 2007 OPEN ] Dining

    \(\\\) \(Description\) 有\(N\)头牛,\(F\)种食物,\(D\)种饮料,每种食物和饮料只有一份. 现在已知每头牛可以吃哪些食物,可以喝哪些饮料,问最多可以让多少头牛可以同时 ...

  2. Singleton.java.ft not found 相关错误的解决办法

    Entry fileTemplates//Singleton.java.ft not found in C:/Users/admin/Desktop/android-studio/lib/resour ...

  3. 1A课程笔记分享_StudyJams_2017

    1A课程 概述 课程1A主要讲解了Android UI的三种基本控件:TextView.ImageView以及Button.笔记的主体内容主要根据课程内容的讲解顺序来组织,此外我对一些个人比较感兴趣的 ...

  4. elasticsearch——海量文档高性能索引系统

    elasticsearch elasticsearch是一个高性能高扩展性的索引系统,底层基于apache lucene. 可结合kibana工具进行可视化. 概念: index 索引: 类似SQL中 ...

  5. JS——大小写转化

    <script> var str = 'JavaScript'; console.log(str.toUpperCase());//小写转大写 console.log(str.toLowe ...

  6. 多线程-实现Runnable接口

    当一个任务或者函数多个线程同时调用时仅仅继承Thread是不行的.需要实现Runnable接口. 好处: 1.将线程的任务从线程的子类中分离出来,进行了单独的封装. 按照面向对象的思想将任务封装成对象 ...

  7. HDU_4826_dp

    Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  8. eclipse Errors during build

    eclipse在运行main方法或者运行ant里的clean方法时,总是会报下面的错,需要点击第二次才能正常运行 今天终于把这个问题解决了,解决方案如下 项目右键,点properties 点击buil ...

  9. %2d

    %2d是C语言中printf函数的输出格式说明符. 具体解释如下: 使输出的int型的数值以2位的固定位宽输出.如果不足2位,则在前面补空格:如果超过2位,则按实际位数输出. 注:如果输出的数值不是i ...

  10. Burnside引理和polay计数 poj2409 Let it Bead

    题目描述 "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you ...