题目就是求树上每个节点的所有祖先中(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:倍增实现可持久化单调栈维护凸包的更多相关文章

  1. 【bzoj5089】最大连续子段和 分块+单调栈维护凸包

    题目描述 给出一个长度为 n 的序列,要求支持如下两种操作: A  l  r  x :将 [l,r] 区间内的所有数加上 x : Q  l  r : 询问 [l,r] 区间的最大连续子段和. 其中,一 ...

  2. [CSP-S模拟测试]:A(单调栈维护凸包+二分答案)

    题目传送门(内部题150) 输入格式 第一行两个整数$N,Q$. 接下来的$N$行,每行两个整数$a_i,b_i$. 接下来的$Q$行,每行一个整数$x$. 输出格式 对于每个询问,输出一行一个整数表 ...

  3. HDU 5033 (单调栈维护凸包) Building

    题意: 一个人在x轴上,他的左右两侧都有高楼,给出楼的横坐标Xi和高度Hi还有人的位置pos,求人所能看到的天空的最大角度. 分析: 将建筑物和人的位置从左到右排序,对于每个位置利用栈求一次人左边建筑 ...

  4. HDU 5033 Building(单调栈维护凸包)

    盗张图:来自http://blog.csdn.net/xuechelingxiao/article/details/39494433 题目大意:有一排建筑物坐落在一条直线上,每个建筑物都有一定的高度, ...

  5. CF535E Tavas and Pashmaks 单调栈、凸包

    传送门 题意:有一场比赛,$N$个人参加.每个人有两种参数$a,b$,如果存在正实数$A,B$使得$\frac{A}{a_i} + \frac{B}{b_i}$在$i=x$处取得最大值(可以有多个最大 ...

  6. bzoj1007: [HNOI2008]水平可见直线 单调栈维护凸壳

    在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例如,对于直线:L1:y=x; L2:y=-x; L3 ...

  7. CF1137E Train Car Selection(单调栈维护凸函数)

    首先本题的关键是一次性加0操作只有第一个0是有用的.然后对于1 k操作,其实就是把之前的所有数删除.对于其他的情况,维护一次函数的和,将(i,a[i])看成平面上的一个点,用单调栈维护一下. #inc ...

  8. LOJ #2769 -「ROI 2017 Day 1」前往大都会(单调栈维护斜率优化)

    LOJ 题面传送门 orz 斜率优化-- 模拟赛时被这题送走了,所以来写篇题解( 首先这个最短路的求法是 trivial 的,直接一遍 dijkstra 即可( 重点在于怎样求第二问.注意到这个第二问 ...

  9. BZOJ1767/Gym207383I CEOI2009 Harbingers 斜率优化、可持久化单调栈、二分

    传送门--BZOJCH 传送门--VJ 注:本题在BZOJ上是权限题,在Gym里面也不能直接看,所以只能在VJ上交了-- 不难考虑到这是一个\(dp\). 设\(dep_x\)表示\(x\)在树上的带 ...

随机推荐

  1. Java基础学习笔记(五) - 常用的API

    API介绍 概念:API 即应用编程程序接口.Java API是JDK中提供给我们使用的类说明文档,这些类将底层的代码实现封装.无需关心这些类是如何实现,只需要学习如何使用. 使用:通过API找到需要 ...

  2. centos7.x 将普通用户加入sudoers中,获取sudo执行权限

    centos7.x 将普通用户加入sudoers中,获取sudo执行权限 0 问题由来   你在提起兴致学习的时候,兴冲冲地往黑洞洞的文本窗口输入下一行: [pan@localhost ~]$ sud ...

  3. Spring Boot (十三): Spring Boot 整合 RabbitMQ

    1. 前言 RabbitMQ 是一个消息队列,说到消息队列,大家可能多多少少有听过,它主要的功能是用来实现应用服务的异步与解耦,同时也能起到削峰填谷.消息分发的作用. 消息队列在比较主要的一个作用是用 ...

  4. Vue入门教程 第四篇 (属性与事件)

    computed计算属性 计算属性(computed)在处理一些复杂逻辑时是很有用的.它的定义方式与methods类似. <div id="app"> <div& ...

  5. 最简单的ArcGIS Engine应用程序(中)

    上一篇中只能添加代码中指定的shp文件(最简单的ArcGIS Engine应用程序(上)) 为了让用户可以浏览磁盘加载指定的shp文件,需做一下调整. 从工具箱往窗体上添加一个OpenFileDial ...

  6. Java学习笔记之面向对象

    面向对象概念 面向对象编程 &面向过程编程 面向对象:关心是谁来做 面向过程:关心的是怎么做 面向对象总结成一句话:就是分工与协作,干活的是对象 生活中: 对象 -----抽象-------- ...

  7. 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 ...

  8. 安装Go语言及搭建Go语言开发环境

    一步一步,从零搭建Go语言开发环境. 安装Go语言及搭建Go语言开发环境 下载 下载地址 Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://gol ...

  9. 利用hash远程登陆系统

    有的时候当我们拿到系统管理员hash由于密码复杂度过高无法破解时候可以利用hash直接进行远程登录 我们用到Metasploit里面的模块 肉鸡为windwos server 2003 x32系统 1 ...

  10. kaldi使用cvte模型进行语音识别

    操作系统 : Unbutu18.04_x64 gcc版本 :7.4.0 该模型在thch30数据集上测试的错误率只有8.25%,效果还是不错的. 模型下载地址: http://www.kaldi-as ...