bzoj 4585 烟火表演 - 动态规划 - 可并堆

时间:2022-10-19 02:53:56

题目传送门

  传送门I

  传送门II

题目大意

  给定一棵带边权有根树,修改一条边的边权的代价是修改前和修改后的值的绝对值之差。不能将一条边的边权改为负数。问使得根节点到所有叶节点的距离相等的最小代价。

  当前正在考虑某个节点,设$f(x)$表示算上它到父节点的边,后将所有叶节点到它的父节点的距离改为$x$的最小代价。设$g(x)$表示将它所在的子树内的所有叶节点到它的距离改为$x$的最小代价,它和它父节点的边的边权为$w$。

  对于一个点的各个子树之间互相独立,所以这个点的$g$函数相当于,它的各个子节点的$f$函数值的和。

$g(x) = \sum_{y\in son(x)}f_{y}(x)$

  对于$f$函数,我们需要做决策:

$f(x) = \min_{0\leqslant y\leqslant x}\left \{ g(y) + \left | w - (x - y) \right | \right \}$

  这等价于将每个位置$x$,考虑它前面位置的$g$函数值,和函数$h(y) = \left | w - (x - y) \right |$的和,然后取一个最小值作为$f(x)$。

  于是就懵逼。值域可能很大,数组也开不下,所以怎么办呢?

  考虑这个函数图像具有的性质。

  首先考虑叶节点的$f$函数(它的$g$函数没有意义)。它是一条优美的绝对值函数的图像:

bzoj 4585 烟火表演 - 动态规划 - 可并堆

  然后在考虑它的父节点,它的父节点的$g$函数将若干个这样的函数加在了一起。因为旧函数的导函数递增,新函数的导函数也等于旧函数导函数的和,所以新函数斜率递增。

  而且这个函数图像非常特殊,每遇到一个拐点,导函数的值加1。

  它的父节点的$g$函数可能会长成下面这个样子(这图画得很不标准):

bzoj 4585 烟火表演 - 动态规划 - 可并堆

  它一定会出现平着的一段区间$[a, b]$。然后分类讨论一下它变换到$f$函数。

bzoj 4585 烟火表演 - 动态规划 - 可并堆

  当$0\leqslant x \leqslant a$时,显然$f(x)$的决策点取$x$最优。

bzoj 4585 烟火表演 - 动态规划 - 可并堆

  当$a < x \leqslant a + w$时,显然$f(x)$的决策点取$a$最优。

bzoj 4585 烟火表演 - 动态规划 - 可并堆

  当$a + w < x \leqslant b + w$时,显然$f(x)$的最优决策点取$x - w$。

bzoj 4585 烟火表演 - 动态规划 - 可并堆

  当$x > b + w$时,决策点取$b$。

  所以整理一下式子不难得到:

$f(x) = \left\{\begin{matrix}g(x) + w \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (0\leqslant x \leqslant a)\\ g(a) + w - x + a \ (a < x \leqslant a + w)\\ g(x - w) \ \ \ \ \ \ (a + w < x \leqslant b + w)\\ g(b) + x - b - w \ \ \ \ \ \ \ (x > b + w)\end{matrix}\right.$

  这有什么用呢?

  考虑它的图像的变化:

bzoj 4585 烟火表演 - 动态规划 - 可并堆

  它相当于将平的一段向右移动了$w$个单位,然后将$[0, a]$的函数图像向上平移了$w$个单位,中间空的一段补斜率为-1的线段。

  然后把$[b, +\infty )$的图像变成斜率为1的射线。

  这样新函数的图像也是一个满足刚刚提到的两点性质的下凸壳,不难证明所有非叶节点的$f, g$函数都满足这样的性质。

  因此,我们考虑用某个数据结构来维护拐点集合。

  所以我们可以平衡树 + 启发式合并来做这道题。于是这样就被卡掉了。

  所以怎么办呢?实际上,我并不需要维护一个完全有序的序列,我只要支持:

  1. 弹掉最大的某几个。
  2. 支持插入元素
  3. 支持快速合并

  因为被弹掉的元素一去不复返,可以暴力弹掉它们,因此可以想到可并堆。

  这样时间复杂度降为$O((n + m)\log (n + m))$。

Code

 /**
* bzoj
* Problem#4585
* Accepted
* Time: 8736ms
* Memory: 18872k
*/
#include <iostream>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#ifndef WIN32
#define Auto "%lld"
#else
#define Auto "%I64d"
#endif
using namespace std;
typedef bool boolean; #define ll long long
const int N = 6e5 + ; typedef class SkewNode {
public:
ll val;
SkewNode *l, *r; SkewNode() { }
}SkewNode; SkewNode pool[N];
SkewNode* top = pool; SkewNode* newnode(int val) {
top->val = val;
return top++;
} SkewNode* merge(SkewNode* a, SkewNode* b) {
if (!a || !b) return (a) ? (a) : (b);
if (a->val < b->val) swap(a, b);
a->r = merge(a->r, b);
swap(a->l, a->r);
return a;
} int n, m;
int *fa, *cs, *ss, *ks;
ll *bs;
SkewNode** rs; inline void init() {
scanf("%d%d", &n, &m);
n += m;
bs = new ll[(n + )];
fa = new int[(n + )];
cs = new int[(n + )];
ss = new int[(n + )];
ks = new int[(n + )];
rs = new SkewNode*[(n + )];
memset(bs, , sizeof(ll) * (n + ));
memset(ks, , sizeof(int) * (n + ));
memset(ss, , sizeof(int) * (n + ));
memset(rs, , sizeof(SkewNode*) * (n + ));
for (int i = ; i <= n; i++)
scanf("%d%d", fa + i, cs + i);
} inline void solve() {
for (int i = n - m + ; i <= n; i++) {
int f = fa[i];
ss[f] += , ks[f] += , bs[f] += cs[i];
rs[f] = merge(rs[f], newnode(cs[i]));
rs[f] = merge(rs[f], newnode(cs[i]));
}
for (int i = n - m; i > ; i--) {
while (ss[i] > ks[i] + ) ss[i]--, rs[i] = merge(rs[i]->l, rs[i]->r);
SkewNode *a = rs[i], *b = rs[i] = merge(rs[i]->l, rs[i]->r);
bs[i] += cs[i], a->val += cs[i], b->val += cs[i], a->l = a->r = NULL;
rs[i] = merge(rs[i], a);
int f = fa[i];
bs[f] += bs[i], ks[f] += ks[i], ss[f] += ss[i];
rs[f] = merge(rs[f], rs[i]);
}
while (ss[] > ks[]) ss[]--, rs[] = merge(rs[]->l, rs[]->r);
ll res = bs[];
while (rs[])
res -= rs[]->val, rs[] = merge(rs[]->l, rs[]->r);
printf(Auto"\n", res);
} int main() {
init();
solve();
return ;
}

bzoj 4585 烟火表演 - 动态规划 - 可并堆的更多相关文章

  1. UOJ &num;205&sol;BZOJ 4585 【APIO2016】Fireworks 可并堆&plus;凸包优化Dp

    4585: [Apio2016]烟火表演 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 115  Solved: 79[Submit][Status] ...

  2. bzoj 4585&colon; &lbrack;Apio2016&rsqb;烟火表演【左偏树】

    参考:https://blog.csdn.net/wxh010910/article/details/55806735 以下课件,可并堆部分写的左偏树 #include<iostream> ...

  3. bzoj 4767 两双手 - 动态规划 - 容斥原理

    题目传送门 传送门I 传送门II 题目大意 一个无限大的棋盘上有一只马,设马在某个时刻的位置为$(x, y)$, 每次移动可以将马移动到$(x + A_x, y + A_y)$或者$(x + B_x, ...

  4. &lbrack;APIO2016&rsqb;烟火表演

    题目描述 https://www.lydsy.com/JudgeOnline/problem.php?id=4585 题解 这题太神了. 我们可以先列出一个dp方程,dp[x][d]表示x节点到所有叶 ...

  5. bzoj 1095 Hide 捉迷藏 - 动态点分治 -堆

    Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双 ...

  6. 【BZOJ 1129】&lbrack;POI2008&rsqb;Per 二叉堆

    这个东西读完题之后,就能知道我们要逐位计算贡献.推一下式子,会发现,这一位的贡献,是当前剩余的数字形成的序列的总数,乘上所剩数字中小于s上这一位的数的个数与所剩数字的总数的比.所以我们维护“当前剩余的 ...

  7. Bzoj 1975&colon; &lbrack;Sdoi2010&rsqb;魔法猪学院 dijkstra&comma;堆&comma;A&ast;&comma;K短路

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1357  Solved: 446[Submit][Statu ...

  8. Bzoj 1598&colon; &lbrack;Usaco2008 Mar&rsqb;牛跑步 dijkstra&comma;堆&comma;K短路&comma;A&ast;

    1598: [Usaco2008 Mar]牛跑步 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 427  Solved: 246[Submit][St ...

  9. BZOJ 2006 NOI2010 超级钢琴 划分树&plus;堆

    题目大意:给定一个序列.找到k个长度在[l,r]之间的序列.使得和最大 暴力O(n^2logn),肯定过不去 看到这题的第一眼我OTZ了一下午... 后来研究了非常久别人的题解才弄明确怎么回事...蒟 ...

随机推荐

  1. matlab环境配置

    一.环境变量设置 AMD处理器:右键单击我的电脑 属性 — >高级 —> 环境变量 —> 系统变量 —> 新建 变量名:BLAS_VERSION,值为安装目录\atlas_At ...

  2. NYOJ题目1051simone牌文本编辑器

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsgAAAKFCAIAAABeD4iTAAAgAElEQVR4nO3dO3LjOtOA4X8TzrUQx1

  3. J2EE 第二阶段项目之部署项目、分工安排

    SVN 先通过使用教程,和能够介绍了解svn. svn使用教程总结   ;   svn功能介绍. 分工安排:我的任务就是项目统计. 1 效益统计 1 教育效益统计表 (教育效益统计表,增,改,查看,查 ...

  4. 3224&colon; Tyvj 1728 普通平衡树

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相 ...

  5. android动画效果大全

    动画类型 Android的animation由四种类型组成  Android动画模式 Animation主要有两种动画模式:一种是tweened animation(渐变动画 XML中 JavaCod ...

  6. Java中abstract和interface的区别

    abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和inte ...

  7. 新页面&comma;简单的tree视图写法

    .xml文件 <?xml version="1.0"?><openerp> <data> <!--Tree view--> < ...

  8. git使用命令记录

    一,两个概念:1.工作区:你电脑里能看见的目录,比如一个项目文件夹就是一个工作区2.版本库工作区(该项目的文件夹)中有一个隐藏文件 .git ,就是git的版本库.(这个文件默认是隐藏,Ctrl+h ...

  9. date 工具类

    package lizikj.bigwheel.common.vo.merchandise.util; import java.text.DateFormat; import java.text.Pa ...

  10. redisTemplate实现轻量级消息队列&comma; 异步处理excel并实现腾讯云cos文件上传下载

    背景 公司项目有个需求, 前端上传excel文件, 后端读取数据.处理数据.返回错误数据, 最简单的方式同步处理, 客户端上传文件后一直阻塞等待响应, 但用户体验无疑很差, 处理数据可能十分耗时, 没 ...