Lost My Music:倍增实现可持久化单调栈维护凸包
题目就是求树上每个节点的所有祖先中(ci-cj)/(dj-di)的最小值。
那么就是(ci-cj)/(di-dj)的最大值了。
对于每一个点,它的(ci,di)都是二维坐标系里的一个点
要求的就是祖先节点的所有点与目前节点连线的最小斜率
比较容易想到单调栈优化,像斜率优化dp一样
但是关键是本题在树上,会有很多麻烦的操作。
当搜到某一个儿子时可能会弹很多栈,而回溯的过程中需要把它们加回来。
如果暴力执行的话,会在蒲公英图退化为n2。
考虑优化:现在的关键就是在于在一个元素可能被弹栈/还原多次的情况下如何快速维护?
考虑倍增。st[i][j]表示从j的代表元素在栈里向前跳2i个元素后的代表元素是谁。我们可以对于每一个节点都开一个log级别的栈。
那么只需要探讨要把某一个元素接在父亲栈里的哪一个位置就好了。单调栈当然满足单调性,故可以倍增跳跃。
那么对于父亲节点的栈其实我们并不改变它。
一个元素因为可能弹栈所以后端的元素可能不唯一,但是入栈时间确定那么前面的元素就唯一确定。
单调栈顶就是最优决策点。
研究代码,很好理解。
#include<cstdio>
int st[][],fir[],l[],to[],cnt,n,c[];
int q[],fa[],dep[];long double ans[];
void link(int a,int b){l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;}
long double calc(int x,int y){return .0L*(c[x]-c[y])/(dep[y]-dep[x]);}
void pop_push(int p){
int x=fa[p];
for(int i=;i>=;--i)if(st[][st[i][x]]&&calc(st[][st[i][x]],st[i][x])<calc(st[i][x],p))x=st[][st[i][x]];
if(st[][x]&&calc(st[][x],x)<calc(x,p))x=st[][x];
st[][p]=x;ans[p]=calc(st[][p],p);
for(int i=;i<=;++i)st[i][p]=st[i-][st[i-][p]];
}
int main(){
scanf("%d",&n);q[]=;
for(int i=;i<=n;++i)scanf("%d",&c[i]);
for(int i=;i<=n;++i)scanf("%d",&fa[i]),link(fa[i],i);
for(int h=,t=;h<=t;++h){
dep[q[h]]=dep[fa[q[h]]]+;pop_push(q[h]);
for(int i=fir[q[h]];i;i=l[i])q[++t]=to[i];
}
for(int i=;i<=n;++i)printf("%.8Lf\n",ans[i]);
}
Lost My Music:倍增实现可持久化单调栈维护凸包的更多相关文章
- 【bzoj5089】最大连续子段和 分块+单调栈维护凸包
题目描述 给出一个长度为 n 的序列,要求支持如下两种操作: A l r x :将 [l,r] 区间内的所有数加上 x : Q l r : 询问 [l,r] 区间的最大连续子段和. 其中,一 ...
- [CSP-S模拟测试]:A(单调栈维护凸包+二分答案)
题目传送门(内部题150) 输入格式 第一行两个整数$N,Q$. 接下来的$N$行,每行两个整数$a_i,b_i$. 接下来的$Q$行,每行一个整数$x$. 输出格式 对于每个询问,输出一行一个整数表 ...
- HDU 5033 (单调栈维护凸包) Building
题意: 一个人在x轴上,他的左右两侧都有高楼,给出楼的横坐标Xi和高度Hi还有人的位置pos,求人所能看到的天空的最大角度. 分析: 将建筑物和人的位置从左到右排序,对于每个位置利用栈求一次人左边建筑 ...
- HDU 5033 Building(单调栈维护凸包)
盗张图:来自http://blog.csdn.net/xuechelingxiao/article/details/39494433 题目大意:有一排建筑物坐落在一条直线上,每个建筑物都有一定的高度, ...
- CF535E Tavas and Pashmaks 单调栈、凸包
传送门 题意:有一场比赛,$N$个人参加.每个人有两种参数$a,b$,如果存在正实数$A,B$使得$\frac{A}{a_i} + \frac{B}{b_i}$在$i=x$处取得最大值(可以有多个最大 ...
- bzoj1007: [HNOI2008]水平可见直线 单调栈维护凸壳
在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例如,对于直线:L1:y=x; L2:y=-x; L3 ...
- CF1137E Train Car Selection(单调栈维护凸函数)
首先本题的关键是一次性加0操作只有第一个0是有用的.然后对于1 k操作,其实就是把之前的所有数删除.对于其他的情况,维护一次函数的和,将(i,a[i])看成平面上的一个点,用单调栈维护一下. #inc ...
- LOJ #2769 -「ROI 2017 Day 1」前往大都会(单调栈维护斜率优化)
LOJ 题面传送门 orz 斜率优化-- 模拟赛时被这题送走了,所以来写篇题解( 首先这个最短路的求法是 trivial 的,直接一遍 dijkstra 即可( 重点在于怎样求第二问.注意到这个第二问 ...
- BZOJ1767/Gym207383I CEOI2009 Harbingers 斜率优化、可持久化单调栈、二分
传送门--BZOJCH 传送门--VJ 注:本题在BZOJ上是权限题,在Gym里面也不能直接看,所以只能在VJ上交了-- 不难考虑到这是一个\(dp\). 设\(dep_x\)表示\(x\)在树上的带 ...
随机推荐
- Java基础学习笔记(五) - 常用的API
API介绍 概念:API 即应用编程程序接口.Java API是JDK中提供给我们使用的类说明文档,这些类将底层的代码实现封装.无需关心这些类是如何实现,只需要学习如何使用. 使用:通过API找到需要 ...
- centos7.x 将普通用户加入sudoers中,获取sudo执行权限
centos7.x 将普通用户加入sudoers中,获取sudo执行权限 0 问题由来 你在提起兴致学习的时候,兴冲冲地往黑洞洞的文本窗口输入下一行: [pan@localhost ~]$ sud ...
- Spring Boot (十三): Spring Boot 整合 RabbitMQ
1. 前言 RabbitMQ 是一个消息队列,说到消息队列,大家可能多多少少有听过,它主要的功能是用来实现应用服务的异步与解耦,同时也能起到削峰填谷.消息分发的作用. 消息队列在比较主要的一个作用是用 ...
- Vue入门教程 第四篇 (属性与事件)
computed计算属性 计算属性(computed)在处理一些复杂逻辑时是很有用的.它的定义方式与methods类似. <div id="app"> <div& ...
- 最简单的ArcGIS Engine应用程序(中)
上一篇中只能添加代码中指定的shp文件(最简单的ArcGIS Engine应用程序(上)) 为了让用户可以浏览磁盘加载指定的shp文件,需做一下调整. 从工具箱往窗体上添加一个OpenFileDial ...
- Java学习笔记之面向对象
面向对象概念 面向对象编程 &面向过程编程 面向对象:关心是谁来做 面向过程:关心的是怎么做 面向对象总结成一句话:就是分工与协作,干活的是对象 生活中: 对象 -----抽象-------- ...
- ubuntu16.04 gcc升级到7.3
下载gcc- wget https://mirrors.ustc.edu.cn/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz 运行 download_prerequisites ...
- 安装Go语言及搭建Go语言开发环境
一步一步,从零搭建Go语言开发环境. 安装Go语言及搭建Go语言开发环境 下载 下载地址 Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://gol ...
- 利用hash远程登陆系统
有的时候当我们拿到系统管理员hash由于密码复杂度过高无法破解时候可以利用hash直接进行远程登录 我们用到Metasploit里面的模块 肉鸡为windwos server 2003 x32系统 1 ...
- kaldi使用cvte模型进行语音识别
操作系统 : Unbutu18.04_x64 gcc版本 :7.4.0 该模型在thch30数据集上测试的错误率只有8.25%,效果还是不错的. 模型下载地址: http://www.kaldi-as ...