题意:有一棵n个点的有根树,每条边上有一个边权。给定P,从i跳到它的祖先j的费用是距离的平方+P,问所有点中到根节点1的总花费最大值

n<=1e5,p<=1e6,w<=1e2

思路:对于根节点到每个点i的路径上是一个下凸壳,是经典的斜率优化

考虑在dfs时维护这个下凸壳,在斜率优化加入与删除点时记录下时间戳和操作的类型,dfs结束时恢复即可

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
typedef long long ll;
using namespace std;
#define N 210000
#define oo 10000000
#define MOD 1000000007 struct node
{
int t,x,y;
}stk[N]; ll dp[N],s[N],P;
int dep[N],head[N],vet[N],nxt[N],len[N],q[N],flag[N],n,top,tot,tim,t,w; int add(int a,int b,int c)
{
nxt[++tot]=head[a];
vet[tot]=b;
len[tot]=c;
head[a]=tot;
} ll sqr(ll x)
{
return x*x;
} ll calc(int i,int j)
{
return dp[j]+sqr(s[i]-s[j])+P;
} int cmp(int x,int y,int z)
{
ll x1=dp[x]-dp[y]+sqr(s[x])-sqr(s[y]);
ll y1=s[x]-s[y];
ll x2=dp[y]-dp[z]+sqr(s[y])-sqr(s[z]);
ll y2=s[y]-s[z];
return x1*y2>=x2*y1;
} void dfs(int u)
{
tim++;
flag[u]=;
if(u==)
{
t=; w=; dp[u]=-P; q[]=;
}
else
{
while(t<w&&calc(u,q[t])>=calc(u,q[t+]))
{
stk[++top].t=tim; stk[top].x=; stk[top].y=q[t];
t++;
}
dp[u]=calc(u,q[t]);
while(t<w&&cmp(q[w-],q[w],u))
{
stk[++top].t=tim; stk[top].x=; stk[top].y=q[w];
w--;
}
q[++w]=u;
stk[++top].t=tim; stk[top].x=;
} int tmp=tim;
int e=head[u];
while(e)
{
int v=vet[e];
if(!flag[v])
{
s[v]=s[u]+len[e];
dfs(v);
}
e=nxt[e];
}
while(stk[top].t==tmp)
{
if(stk[top].x==) q[--t]=stk[top].y;
if(stk[top].x==) q[++w]=stk[top].y;
if(stk[top].x==) w--;
top--;
}
} int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
int n;
scanf("%d%d",&n,&P);
s[]=;
tot=;
for(int i=;i<=n;i++) head[i]=flag[i]=;
for(int i=;i<=n-;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
tim=;
t=; w=; top=;
dfs();
ll ans=;
for(int i=;i<=n;i++) ans=max(ans,dp[i]);
printf("%I64d\n",ans);
}
return ;
}

最新文章

  1. BRDF 光照模型
  2. ASP模拟POST请求异步提交数据的方法
  3. CSS浏览器兼容问题总结
  4. 如何利用tomcat和cas实现单点登录(1):配置tomcat的ssl和部署cas
  5. 探索HashMap实现原理及其在jdk8数据结构的改进
  6. Dataset的基本操作
  7. How to install ruby on mac/ change ruby source in china
  8. php生成圆形图片
  9. ASP.NET MVC编程——视图
  10. PHP面试大全 基础篇100道问题
  11. 还原Azure DevOps Server (TFS)中误删除的生成流水线
  12. 使用sklearn机器学习库实现线性回归
  13. java 偏向锁,轻量锁,重量级锁
  14. Hibernate的集合一对多与多对一
  15. [android] WebView自定义浏览器
  16. Pandas删除数据的几种情况
  17. 优先级:P0
  18. arcgis for js/flex/sl 该选哪一个?
  19. Set去掉重复的元素
  20. valgrind 代码检查,内存泄漏

热门文章

  1. 32-2题:LeetCode102. Binary Tree Level Order Traversal二叉树层次遍历/分行从上到下打印二叉树
  2. rsyn远程自动同步
  3. 九、MySQL 创建数据表
  4. tp5 使用paginate分页获取数据对象之后 如何对对象进行数据添加
  5. JZOJ 1321. 灯
  6. Paul Zindel【保罗&#183;金代尔】
  7. String使用方法详解
  8. Android开发——JVM、Dalvik以及ART的区别
  9. HDU 3032 Nim or not Nim?(Multi_SG,打表找规律)
  10. TCP/IP网络编程之基于UDP的服务端/客户端