链接:https://www.luogu.org/problemnew/show/P3642

跟上一道题类似但更难,首先也是观察出在某个节点代价是下凸的函数,并且得到转移方程:

1.x<=L f'(x)=f(x)+w;

2.L<=x<=L+w f'(x)=f(L)+w-(x-L)

3.L+w<=x<=R+w f'(x)=f(L)

4.R+w<=x f'(x)=f(L)+(x-R)-w

意思是当前节点考虑到父亲的那条边权为w的边对于不同x取值的转移,【L,R】表示最小代价的左右端点,而因为在叶子节点初始化只有一个点(实际上是两个中间是长度为0的斜率为0的线)左边斜率-1右边+1,再看转移操作可以画图发现实际上是将函数整体右移了w距离。发现这个性质就又能像之前那题通过维护关键点(转折点)得出答案了,对每个点开可并大根堆,维护的点到R(当前最优解能取到最右边的),在某节点合并儿子子树时,发现会多(孩子数-1)这么多个斜率大于0的,pop掉即可的当前L,R,然后发现整体右移操作其实就相当于删除L,R然后插入L+w和R+w,最后因为发现f(0)为所有边边权和,反推回L处答案即可。

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=6e5+100;struct Heap{int ls,rs;ll w;Heap(){};Heap(int ls,int rs,ll w):ls(ls),rs(rs),w(w){};
}nd[N*2];
ll sum=0;
int n,m,fa[N],w[N],in[N],rt[N],hnum=0;
vector<int>son[N];int mg(int x,int y)
{if(!x||!y)return x+y;if(nd[x].w<nd[y].w)swap(x,y);if(rand()&1)nd[x].ls=mg(nd[x].ls,y);else nd[x].rs=mg(nd[x].rs,y);  return x;
}ll top(int x){return nd[x].w;}
void pop(int &x){x=mg(nd[x].ls,nd[x].rs);}void dfs(int pos)
{ll l=0,r=0;if(pos<=n){for(int j=0;j<son[pos].size();j++)dfs(son[pos][j]),rt[pos]=mg(rt[pos],rt[son[pos][j]]);for(int j=1;j<in[pos];j++)pop(rt[pos]);r=top(rt[pos]),pop(rt[pos]),l=top(rt[pos]),pop(rt[pos]);}if(pos!=1){nd[++hnum]=Heap(0,0,l+w[pos]),nd[++hnum]=Heap(0,0,r+w[pos]);rt[pos]=mg(rt[pos],mg(hnum-1,hnum));}else{sum-=l;while(rt[pos])sum-=top(rt[pos]),pop(rt[pos]);printf("%lld\n",sum);}
}int main()
{scanf("%d%d",&n,&m);for(int i=2;i<=n+m;i++)scanf("%d%d",&fa[i],&w[i]),in[fa[i]]++,son[fa[i]].push_back(i),sum+=w[i];dfs(1);
}

[APIO2016]烟火表演相关推荐

  1. [Luogu P3642] [BZOJ 4585] [APIO2016]烟火表演

    洛谷传送门 BZOJ传送门 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连.导火索的连接方式形成一 ...

  2. BZOJ4585: [Apio2016]烟火表演

    Description 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安 全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连.导火索的连接方式形成 一棵树,烟花 ...

  3. P3642 [APIO2016]烟火表演(左偏树、函数)

    解析 感觉是左偏树的神题了. 首先有一个比较显然的结论,一个合法的方案中,两个叶子到它们 lca\text{lca}lca 的距离必须相等. 考虑设计 dp\text{dp}dp : fi,xf_{i ...

  4. 【LOJ】apio2016烟火表演-可并堆凸包

    讲解详见ppt%%%% 代码 #include<cstdio> #include<cstring> #include<iostream> #include<a ...

  5. BZOJ4585 [Apio2016]烟火表演

    "这个凸包的形式,妙啊,他妙啊,妙啊" 王梦迪神犇在讲题的时候写的题解挺详细的 我们对每个点,有一个把子树内长度统一的花费关于统一成的长度的函数f(x),易知这个函数是下凸的,对于 ...

  6. luogu P3642 [APIO2016]烟火表演

    https://www.luogu.com.cn/problem/P3642 好毒瘤啊!!! 首先按照套路 设f(x)表示以u为根的,距离为x的最小代价设f(x)表示以u为根的,距离为x的最小代价设f ...

  7. 【APIO2016】烟火表演(可并堆)(折线DP)

    传送门 题解: 设fi(x)f_i(x)fi​(x)表示在iii的子树中,所有叶子到iii距离为xxx的时候,子树内部修改的最小代价. 显然是个分段一次函数,大力讨论记录下端点就行了. 注意到可能会出 ...

  8. 【APIO2016】烟火表演

    题面 题解 神仙题目啊QwQ 设\(f_i(x)\)表示以第\(i\)个点为根的子树需要\(x\)秒引爆的代价. 我们发现,这个函数是一个下凸的一次分段函数. 考虑这个函数合并到父亲节点时会发生怎样的 ...

  9. (APIO)烟火表演

    - - 不要问我发生了什么- 要问就去这篇博客下面留言,拷问这个博主的良心 于是!我今天来做这道题了- (我也是够会作的-) 题目描述 众所周知,是最引人注目的节日活动之一.在表演中,所有的烟花必须同 ...

最新文章

  1. Selenium + Python + Chrome 自动化测试 环境搭建
  2. RESTheart官方文档
  3. ChromeDriver启动Chrome浏览器后,地址栏只显示data;——chromeDriver版本不对
  4. undefined reference to `vtable for XX::XX'
  5. c++ primer 第六版 pdf_A3N630 塑壳断路器如何更换.pdf
  6. Bootstrap CSS 编码规范之不要使用 @import
  7. 关于滚动相关的属性【转】
  8. 年龄是计数还是计量_MSA你只知道计量型和计数型?有哪些类型?分别是什么方法?...
  9. FPGA智能传感系统(一)Verilog基础入门
  10. 安装Sublime Text 3插件的方法
  11. 我的世界java作弊怎么开_我的世界怎么开作弊?如何启用作弊模式?
  12. Solidworks教程:利用Simulation模拟热传导
  13. 按键精灵修改html内容,按键精灵批量开网页点击
  14. swarm bzz 安装0.5.3,和节点引导
  15. 18位身份证号码校验
  16. python中加注释_python中如何添加注释
  17. 修改win服务器防火墙端口号,Windows Server 修改防火墙和远程桌面(3389)默认端口...
  18. 数学建模----聚类分析
  19. mybatis第十话 - mybaits整个事务流程的源码分析
  20. FileSaver.js下载图片

热门文章

  1. 读取太阳紫外辐照谱数据
  2. 我的Vu啊(vue 2.0,数据监听,计算属性,组件传参)
  3. MongoDB的客户端管理工具--nosqlbooster 连接MongoDB服务器
  4. matlab 双目 景深,双照相机景深分析的思路
  5. Java内部类与异常类(上机实践二)
  6. python将txt转为字符串_Python玩转《生僻字》
  7. Java笔记013-IDEA、包、访问修饰符、封装、继承、多态、Super、方法重写/覆盖(override)、java的动态绑定机制
  8. 大唐芙蓉园游记(r11笔记第56天)
  9. Places: A 10 million Image Database for Scene Recognition
  10. Fanuc发那科法兰克数据采集实战c#——CNC数控系统数据采集、西门子免授权数据采集方案