Lost My Music:倍增实现可持久化单调栈维护凸包

题目就是求树上每个节点的所有祖先中(ci-cj)/(dj-di)的最小值。

那么就是(ci-cj)/(di-dj)的最大值了。

对于每一个点,它的(ci,di)都是二维坐标系里的一个点

要求的就是祖先节点的所有点与目前节点连线的最小斜率

比较容易想到单调栈优化,像斜率优化dp一样

但是关键是本题在树上,会有很多麻烦的操作。

当搜到某一个儿子时可能会弹很多栈,而回溯的过程中需要把它们加回来。

如果暴力执行的话,会在蒲公英图退化为n2

考虑优化:现在的关键就是在于在一个元素可能被弹栈/还原多次的情况下如何快速维护?

考虑倍增。st[i][j]表示从j的代表元素在栈里向前跳2i个元素后的代表元素是谁。我们可以对于每一个节点都开一个log级别的栈。

那么只需要探讨要把某一个元素接在父亲栈里的哪一个位置就好了。单调栈当然满足单调性,故可以倍增跳跃。

那么对于父亲节点的栈其实我们并不改变它。

一个元素因为可能弹栈所以后端的元素可能不唯一,但是入栈时间确定那么前面的元素就唯一确定。

单调栈顶就是最优决策点。

研究代码,很好理解。

 1 #include<cstdio>
 2 int st[22][500005],fir[500005],l[500005],to[500005],cnt,n,c[500005];
 3 int q[500005],fa[500005],dep[500005];long double ans[500005];
 4 void link(int a,int b){l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;}
 5 long double calc(int x,int y){return 1.0L*(c[x]-c[y])/(dep[y]-dep[x]);}
 6 void pop_push(int p){
 7     int x=fa[p];
 8     for(int i=20;i>=0;--i)if(st[0][st[i][x]]&&calc(st[0][st[i][x]],st[i][x])<calc(st[i][x],p))x=st[0][st[i][x]];
 9     if(st[0][x]&&calc(st[0][x],x)<calc(x,p))x=st[0][x];
10     st[0][p]=x;ans[p]=calc(st[0][p],p);
11     for(int i=1;i<=20;++i)st[i][p]=st[i-1][st[i-1][p]];
12 }
13 int main(){
14     scanf("%d",&n);q[1]=1;
15     for(int i=1;i<=n;++i)scanf("%d",&c[i]);
16     for(int i=2;i<=n;++i)scanf("%d",&fa[i]),link(fa[i],i);
17     for(int h=1,t=1;h<=t;++h){
18         dep[q[h]]=dep[fa[q[h]]]+1;pop_push(q[h]);
19         for(int i=fir[q[h]];i;i=l[i])q[++t]=to[i];
20     }
21     for(int i=2;i<=n;++i)printf("%.8Lf\n",ans[i]);
22 }

原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11371320.html

时间: 2024-08-05 22:07:08

Lost My Music:倍增实现可持久化单调栈维护凸包的相关文章

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

题意: 一个人在x轴上,他的左右两侧都有高楼,给出楼的横坐标Xi和高度Hi还有人的位置pos,求人所能看到的天空的最大角度. 分析: 将建筑物和人的位置从左到右排序,对于每个位置利用栈求一次人左边建筑物的凸包,找到一个最小的角度,然后对称一下,再找一个右边的建筑物的最小角度,两个角度加起来就是答案. 将人左边的建筑物从左到右扫描,下面两种情况会出栈: 栈顶元素楼高小于等于当前扫描到的楼高,因此这是一个单调的栈 栈顶两个楼顶所在直线的斜率 小于 栈顶的楼顶和当前楼顶所在直线的斜率(这里的斜率指的是

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

首先本题的关键是一次性加0操作只有第一个0是有用的.然后对于1 k操作,其实就是把之前的所有数删除.对于其他的情况,维护一次函数的和,将(i,a[i])看成平面上的一个点,用单调栈维护一下. #include<bits/stdc++.h> using namespace std; const int N=3e5+7; #define int long long typedef pair<int,int>pii; int n,k,b,Q,top; pii st[N]; long do

POJ2796---Feel Good(前缀和+单调栈维护)

Description Bill is developing a new mathematical theory for human emotions. His recent investigations are dedicated to studying how good or bad days influent people's memories about some period of life. A new idea Bill has recently developed assigns

【单调栈维护连续区间】2019.1.18模拟赛T2 浇花

这道题是一道单调栈的题 1 题目描述 2 JDFZ在餐厅门前种了一排nn棵花,每棵花都有一个高度.浇花大爷会枚举所有的区间,然后从区间中找出一个高度最矮的花进行浇水.由于浇花大爷浇完水之后就精疲力竭了,所以请你帮助他计算每棵花都被浇了几次水. 3 4 输入格式 5 第一行一个整数nn. 第二行nn个整数,分别表示每棵花的高度. 6 7 输出格式 8 一行nn个整数用空格隔开,分别表示每棵花被浇了几次水. 9 10 样例一 11 input 12 3 13 1 3 5 14 output 15 3

poj2599 单调栈维护最大连续矩形面积

这个题就是给你一串连续的矩形, 每个矩形的宽度为1, 高度给定, 选定连续的一串矩形, 其高度是所有矩形高度中的最小值,宽度为选定的, 问怎么选能使矩形的面积最大?我们以一个矩形为中心,并设这个矩形的高度最小, 分别向两边延生, 那么此时的最大面积就是a[i] * (R[i]-l[i]+1), 代码如下: #include <cstdio> #include <cstring> #include <algorithm> #include <iostream>

【bzoj5089】最大连续子段和 分块+单调栈

题目描述 给出一个长度为 n 的序列,要求支持如下两种操作: A  l  r  x :将 [l,r] 区间内的所有数加上 x : Q  l  r : 询问 [l,r] 区间的最大连续子段和. 其中,一个区间的最大连续子段和指的是:该区间所有子区间的区间和中的最大值(本题中子区间包括空区间,区间和为 0 ). 输入 第一行两个整数 n.m,表示序列的长度以及操作的数目. 之后的 m 行,每行输入一个操作,含义如题目所述.保证操作为  A  l  r  x  或  Q  l  r  之一. 对于 3

【NOIP数据结构专项】单调队列单调栈

[洛谷P1901 ]发射站 http://www.luogu.org/problem/show?pid=1901 题目描述 某地有 N 个能量发射站排成一行,每个发射站 i 都有不相同的高度 Hi,并能向两边(当 然两端的只能向一边)同时发射能量值为 Vi 的能量,并且发出的能量只被两边最近的且比 它高的发射站接收. 显然,每个发射站发来的能量有可能被 0 或 1 或 2 个其他发射站所接受,特别是为了安 全,每个发射站接收到的能量总和是我们很关心的问题.由于数据很多,现只需要你帮忙计 算出接收

Educational Codeforces Round 23 D. Imbalanced Array(单调栈)

题目链接:Educational Codeforces Round 23 D. Imbalanced Array 题意: 给你n个数,定义一个区间的不平衡因子为该区间最大值-最小值. 然后问你这n个数所有的区间的不平衡因子和 题解: 对每一个数算贡献,a[i]的贡献为 当a[i]为最大值时的 a[i]*(i-l+1)*(r-i+1) - 当a[i]为最小值时的a[i]*(i-l+1)*(r-i+1). 计算a[i]的l和r时,用单调栈维护.具体看代码,模拟一下就知道了. 然后把所有的贡献加起来.

POJ2796Feel Good[单调栈]

Feel Good Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 13376   Accepted: 3719 Case Time Limit: 1000MS   Special Judge Description Bill is developing a new mathematical theory for human emotions. His recent investigations are dedicated