正题

题面链接:https://www.luogu.com.cn/problem/CF932F


题目大意

nnn个点的一棵树,从xxx跳到yyy(要求yyy在xxx的子树中)会产生Ax∗ByA_x*B_yAx​∗By​的代价,求每个节点出发跳到某个叶节点的最小代价。


解题思路

考虑dpdpdp的话,那么有fx=fy+Ax∗Byf_x=f_y+A_x*B_yfx​=fy​+Ax​∗By​,这个式子可以考虑斜率优化,若y1y_1y1​比y2y_2y2​优,那么有fy1−fy2By1−By2≥Ax\frac{f_{y_1}-f_{y_2}}{B_{y_1}-B_{y_2}}\geq A_xBy1​​−By2​​fy1​​−fy2​​​≥Ax​
也就是我们对于每个节点要维护一个子树里所有点构成的一个下凸壳。

考虑树上启发式合并+CDQ+CDQ+CDQ,我们要求一个序列使得被贡献的点排在贡献点的后面。维护一个序列,每次我们保留重子树的序列,然后再加入其它轻子树的序列,当到一个节点的头顶上是一条轻边时我们就对这个序列跑一次CDQCDQCDQ来维护凸壳,然后清空序列。需要注意的是对于二次扫描轻子树的节点需要标记不能在CDQCDQCDQ分治中被修改答案。

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#define ll long long
using namespace std;
const ll N=1e5+10;
struct node{ll to,next;
}e[N*2];
ll n,tot,ls[N],a[N],b[N],f[N],siz[N],son[N];
ll cnt,q[N],p[N],v[N],st[N],rfn[N];
void addl(ll x,ll y){e[++tot].to=y;e[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(ll x,ll fa){siz[x]=1;for(ll i=ls[x];i;i=e[i].next){ll y=e[i].to;if(y==fa)continue;dfs(y,x);siz[x]+=siz[y];if(siz[y]>siz[son[x]])son[x]=y;}return;
}
bool cmp(ll x,ll y)
{return a[x]<a[y];}
bool cMp(ll x,ll y)
{return (b[x]==b[y])?(f[x]<f[y]):(b[x]<b[y]);}
double slope(ll x,ll y)
{return (double)(f[x]-f[y])/(b[x]-b[y]);}
void cdq(ll l,ll r){if(l==r)return;ll mid=(l+r)>>1,cnt1=l-1,cnt2=mid;for(ll i=l;i<=r;i++)if(rfn[p[i]]<=mid)q[++cnt1]=p[i];else q[++cnt2]=p[i];for(ll i=l;i<=r;i++)p[i]=q[i];cdq(l,mid);ll tot=0;for(ll i=l;i<=mid;i++){if(b[p[i]]==b[p[i-1]]&&i!=l)continue;while(tot>1&&slope(st[tot-1],st[tot])>slope(st[tot-1],p[i]))tot--;st[++tot]=p[i];}for(ll i=mid+1;i<=r;i++){if(v[p[i]])continue;while(tot>1&&slope(st[tot-1],st[tot])>-a[p[i]])tot--;ll x=p[i],y=st[tot];f[x]=min(f[x],f[y]+a[x]*b[y]);}cdq(mid+1,r);sort(p+l,p+1+r,cMp);return;
}
void calc(ll x,ll fa){p[++cnt]=x;rfn[x]=cnt;v[x]=1;for(ll i=ls[x];i;i=e[i].next){ll y=e[i].to;if(y==fa)continue;calc(y,x);}
}
void solve(ll x,ll fa,ll top){for(ll i=ls[x];i;i=e[i].next){ll y=e[i].to;if(y==fa||y==son[x])continue;solve(y,x,y);}if(son[x])solve(son[x],x,top);else f[x]=0;for(ll i=ls[x];i;i=e[i].next){ll y=e[i].to;if(y==fa||y==son[x])continue;calc(y,x);}p[++cnt]=x;rfn[x]=cnt;v[x]=(!son[x]);if(x==top){sort(p+1,p+1+cnt,cmp);cdq(1,cnt);cnt=0;}return;
}
int main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);for(ll i=1;i<=n;i++)scanf("%lld",&b[i]);for(ll i=1;i<n;i++){ll x,y;scanf("%lld%lld",&x,&y);addl(x,y);addl(y,x);}memset(f,0x3f,sizeof(f));dfs(1,1);solve(1,1,1);for(ll i=1;i<=n;i++)printf("%lld\n",f[i]);return 0;
}

CF932F-Escape Through Leaf【树上启发式合并,CDQ分治,斜率优化dp】相关推荐

  1. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

  2. BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]

    传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...

  3. 【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化

    [BZOJ3963][WF2011]MachineWorks Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先 ...

  4. 树上启发式合并问题 ---- 2019icpc南昌 K. Tree (树上启发式合并 + 动态开点线段树)

    题目链接 题目大意: 就是给你一颗树,每个点有个权值viv_ivi​,问你有多少对(x,y)(x,y)(x,y)满足: xxx不是yyy的祖先 yyy也不是xxx的祖先 xxx和yyy的距离不超过kk ...

  5. 树上启发式合并问题 ---- D. Tree and Queries[树上启发式合并+树状数组]

    题目链接 题目大意: 就是给你一棵树,树上每个节点都有一个颜色,在你mmm次询问每次询问给你一个节点uuu和一个数字kkk,问你在uuu这颗子树里面又少种颜色的结点个数是大于kkk; 解题思路: 看到 ...

  6. 树上启发式合并问题 ---- D. Tree Requests [状态压缩+树上启发式合并]

    题目链接 题目大意: 就是给你一颗树,树上每个点都有一个小写字母,现在给你m∈[1,5e5]m\in [1,5e5]m∈[1,5e5]次询问,每次询问给你一个u,和deep,问你在u这课子树中,距离1 ...

  7. 树上启动式合并问题 ---- D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths [状态压缩+树上启发式合并]

    题目链接 题目大意: 一棵根为1 的树,每条边上有一个字符(a−va−va−v共22种). 一条简单路径被称为Dokhtar−kosh当且仅当路径上的字符经过重新排序后可以变成一个回文串. 求每个子树 ...

  8. 2019 ICPC 南昌 K. Tree(树上启发式合并,平衡树 treap)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://nanti.jisuanke.com/t/42586 Problem 给定一 ...

  9. 【学习笔记】树上启发式合并

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 树上启发式合并 模板 复杂度分析 例题 **Problem A. Arpa's letter-m ...

最新文章

  1. 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Minimax策略...
  2. java solar_java中的内部类总结
  3. 史上最全,100+大数据开源处理工具汇总
  4. 饱和气压与温度的关系_不同温度下空气中饱和水分含量及饱和蒸汽压
  5. Python2寿命只剩一个月啦!还不快赶紧学起Python3酷炫到爆的新特性!
  6. MongoDB的集群模式--Replica Set
  7. hdu 4753 Fishhead’s Little Game
  8. Android 广告内容结合,Android Headlines大盘点:2018华为广告“创新高”
  9. [ILINK32 Error] Error: Unresolved external 'WSAIoctl'
  10. Android 测试技能树
  11. vue中使用iconfont图标
  12. android usb 读写权限,Android默认给予USB读写权限,去掉受权对话框
  13. wuauclt.exe是什么进程?为什么运行?wuauclt.exe进程介绍
  14. 无需关注微信公众号破解openwrite验证
  15. iOS 修改系统返回键
  16. excel2003打开后找不到工作表
  17. Intellij IDEA插件--Key Promoter X
  18. DUTOJ-1003: Zeratul的军训游戏
  19. 国信证券开源自研的微服务开发框架 Zebra
  20. 给 1 万个粉丝的一封信

热门文章

  1. python中def和return是必须使用的保留字吗_Python 保留字和关键字的用法
  2. mindray心电监护仪使用说明_怎么看监护仪上的参数
  3. qt制作一个画板_如何直接用Sketch制作动画|Sketch插件|
  4. 二叉树序列化与反序列化相关题目(Leetcode题解-Python语言)
  5. [JavaWeb-HTML]HTML标签_图片标签
  6. 《C++ Primer》8.3.1节练习
  7. android环境搭建出错,androidstudio配置环境遇到的各种错误(持续更新中)
  8. 自动生成sqlserver增删改成_如何批量生成证书证件-可变条码-可变图片-可变数据-快速教程...
  9. CSS3动画大全(附源码)flex布局,grid布局3d旋转,图像模糊,文字发光
  10. erlang rebar 配置mysql_Erlang Rebar 使用指南之四:依赖管理