「APIO2016」烟花表演

解题思路

又是一道 solpe trick 题,观察出图像变化后不找一些性质还是挺难做的。

首先令 \(dp[u][i]\) 为节点 \(u\) 极其子树所有叶子到 \(u\) 距离为 \(i\) 的最少代价,显然有

\[dp[u][i]=\sum_{v\in son(u)}\min_{0\leq j \leq i}\{dp[v][j]+|C(u,v)-(i-j)|\}
\]

定义函数

\[f_u(x)=dp[u][x] , g_u(x)= \min_{0\leq i\leq x}\{dp[u][x]+|C(fa[u],u)-(x-i)|\}
\]

可以得到 \(f_u(x) = \sum_{v \in son(u)} g_v(x)\) 。

不难证明,\(f,g\) 的图像都是一个下凸包,且相邻的段之间斜率变化为 \(1\) ,考虑由 \(f_u(x)\) 到 \(g_u(x)\) 的过程

令 \(L, R\) 为 \(f_u\) 最下面那条边的左右端点,\(len=C(fa[u],u)\) ,把过程看做对图像的操作,那么有:

\[g_u(x)=
\begin{cases}
f_u(x)+len& x<L \\
f_u(L)+len-(x-L) &L\leq x<L+len \\
f_u(L) & L + len \leq x\leq R+len \\
f_u(R)+(x-R)-len & x>R+len
\end{cases}
\]

考虑维护这个凸包的拐点,1,2,3操作合起来相当于删除凸包上 \(L,R\) 两个拐点,然后插入 \(L+len,R+len\) 这两个拐点。

4操作只需要在之前把斜率 \(\geq1\) 的拐点删除到只剩一个即可,不难证明对于非叶子节点,这样的拐点只有儿子数量 \(-1\) 个,删完之后要找的 \(L,R\) 就是当前最右边的两个拐点。

那么对于每一个 \(u\) 只需要将所有儿子的 \(g\) 合并起来即可得到当前的 \(f\) ,可并堆/线段树合并实现都是 \(\mathcal O((n+m)\log n)\)。

我们维护出来 \(f_1\) 的所有拐点之后,求答案只需要用 \(f_1(0)\) 的值减去所有斜率 \(\leq0\) 的拐点的横坐标即可。

code

/*program by mangoyang*/
#include <bits/stdc++.h>
#include <ext/pb_ds/priority_queue.hpp>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int f = 0, ch = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
}
const int N = 1000005;
ll ans;
int fa[N], len[N], deg[N], n, m;
__gnu_pbds::priority_queue<ll> pq[N];
int main(){
read(n), read(m);
for(int i = 2; i <= n + m; i++){
read(fa[i]), deg[fa[i]]++;
read(len[i]), ans += len[i];
}
for(int i = n + m; i > 1; i--){
ll x = 0, y = 0;
if(i <= n){
for(int j = 1; j < deg[i]; j++) pq[i].pop();
x = pq[i].top(), pq[i].pop();
y = pq[i].top(), pq[i].pop();
}
pq[fa[i]].push((ll) x + len[i]);
pq[fa[i]].push((ll) y + len[i]);
pq[fa[i]].join(pq[i]);
}
for(int i = 1; i <= deg[1]; i++) pq[1].pop();
while(!pq[1].empty())
ans -= pq[1].top(), pq[1].pop();
cout << ans << endl;
return 0;
}

「APIO2016」烟花表演的更多相关文章

  1. Loj #2568. 「APIO2016」烟花表演

    Loj #2568. 「APIO2016」烟花表演 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连 ...

  2. 【LOJ】#2568. 「APIO2016」烟花表演

    题解 这个听起来很毒瘤的想法写起来却非常休闲,理解起来可能很费劲 例如,我们首先到猜到答案是个下凸包 然后是不是要三分???然而并不是orz 我们通过归纳证明这个下凸包的结论来总结出了一个算法 也就是 ...

  3. 「JSOI2014」歌剧表演

    「JSOI2014」歌剧表演 传送门 没想到吧我半夜切的 这道题应该算是 \(\text{JSOI2014}\) 里面比较简单的吧... 考虑用集合关系来表示分辨关系,具体地说就是我们把所有演员分成若 ...

  4. LOJ 2567: 洛谷 P3643: bzoj 4584: 「APIO2016」划艇

    题目传送门:LOJ #2249. 题意简述: 有 \(n\) 个位置,第 \(i\) 个位置可以填在 \([a_i,b_i]\) (\(1\le a_i\le b_i\le 10^9\))之间的整数, ...

  5. 【LOJ】#2567. 「APIO2016」划艇

    题解 显然有个很暴力的dp,\(dp[i][j]\)表示选到第\(i\)个数,末尾的数是\(j\)的方案数 但是第二维就开不下了,怎么办呢 考虑离散化整个区间,我们记录\(dp[i][j][k]\)表 ...

  6. 【LOJ】#2569. 「APIO2016」最大差分

    题解 第一个子任务直接询问最大最小,每次可以问出来两个,再最大最小-1再问两个,最多问\(\frac{N + 1}{2}\)次就还原出了序列 第二个子任务由于差分肯定会大于等于\(\lceil \fr ...

  7. LOJ2303 「NOI2017」蚯蚓排队

    「NOI2017」蚯蚓排队 题目描述 蚯蚓幼儿园有$n$只蚯蚓.幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演. 所有蚯蚓用从$1$到$n$的连续正整数编号.每只蚯蚓的长度可以用一个正整数表示 ...

  8. 「干货」面试官问我如何快速搜索10万个矩形?——我说RBush

    「干货」面试官问我如何快速搜索10万个矩形?--我说RBUSH 前言 亲爱的coder们,我又来了,一个喜欢图形的程序员‍,前几篇文章一直都在教大家怎么画地图.画折线图.画烟花,难道图形就是这样嘛,当 ...

  9. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

随机推荐

  1. MuPAD使用总结

    MuPAD使用总结 一.打开notebook界面的方法: 二.notebook界面的三种区域 (一).输入区域 输入区域在打开来的时候就有,就是,但是之后如果还想再加,可以点击上方红色框内的图标. 这 ...

  2. React_03_ECMAScript6

    1.ES6解构赋值 1.1.解构赋值概述 解构赋值是对赋值运算符的扩展. 它是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值.在代码书写上简洁且易读,语义更加清晰明了:也方便了复杂对象中数 ...

  3. Markdown文字添加颜色

    转自:原文地址 添加红色 效果: 写法: $\color{red}{red}$ 添加绿色 效果: 写法: $\color{green}{green}$ 添加蓝色 效果: 写法: $\color{blu ...

  4. MySql 三大知识点——索引、锁、事

    作者:莫那鲁道原文:http://thinkinjava.cn/2019/03/16/2019-03-16-mysql/ 1. 索引 索引,类似书籍的目录,可以根据目录的某个页码立即找到对应的内容. ...

  5. 分布式CAP理论介绍:一致性(Consistency),可用性(Availability),容忍网络分区(Partition tolerance)

    在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点: 一致性(Consisten ...

  6. SQL server 表结构转Oracle SQL脚本

    SQL server 表结构转Oracle SQL脚本 /****** Object: StoredProcedure [dbo].[getOracle] Script Date: 2019/7/25 ...

  7. Python集成开发环境(IDE:Integrated Development Environment): PyCharm

    原文地址:https://www.runoob.com/python/python-install.html IDE下载安装 PyCharm 是由 JetBrains 打造的一款 Python IDE ...

  8. pytorch visdom可视化工具学习—3-命令行操作使用经验

    在使用过程中一直以为要在哪个指定的environment下(即参数env)绘制内容,就必须在使用时声明 比如如果不声明,默认的就是在'main'环境下,端口为8097: viz = visdom.Vi ...

  9. TensorFlow-线程回归模型

    实验目的: 方程:y = Wx + b 通过大量的(x, y)坐标值,模型可以计算出接近W和b的值 实验步骤: 第一步:生成线程回归方程模型所需要的数据 import numpy as np impo ...

  10. Python - Django - 使用 Bootstrap 样式修改注册页

    reg2 函数: from django.shortcuts import render, HttpResponse from app01 import models def reg2(request ...