P2659 美丽的序列 单调栈维护区间最小值,单调递增栈维护区间最小值, 考虑当前数对答案的贡献,不断加入数,如果加入的数$>$栈顶,说明栈顶的元素对当前数所在区间是有贡献的,同时加入当前的数. 反之,若当前加入的数比栈顶元素小,那么栈顶元素(所谓的最小值)已经失去了价值,因为他不会再对后面的区间造成影响,所以弹出栈顶,同时更新$ans$ #include<iostream> #include<cstdio> #include<algorithm> #define…
P2659 美丽的序列 题目链接 https://www.luogu.org/problemnew/show/P2659 题目描述 为了研究这个序列的美丽程度,GD定义了一个序列的"美丽度"和"美丽系数":对于这个序列的任意一个区间[l,r],这个区间的"美丽度"就是这个区间的长度与这个区间的最小值的乘积,而整个序列的"美丽系数"就是它的所有区间的"美丽度"的最大值.现在GD想要你帮忙计算这个序列的&quo…
P2659 美丽的序列 题目背景 GD是一个热衷于寻求美好事物的人,一天他拿到了一个美丽的序列. 题目描述 为了研究这个序列的美丽程度,GD定义了一个序列的"美丽度"和"美丽系数":对于这个序列的任意一个区间\([l,r]\),这个区间的"美丽度"就是这个区间的长度与这个区间的最小值的乘积,而整个序列的"美丽系数"就是它的所有区间的"美丽度"的最大值.现在GD想要你帮忙计算这个序列的"美丽系数&q…
题目 该题目可以用辅助数组l[i], r[i]来指向以data[i]为最小值的左端点和右端点.然后最后枚举每个data[i]寻找每个data[i]的美丽值的最大值. 然后辅助数组可以用单调栈求出. #include <cstdlib> #include <cmath> #include <cstdio> #include <algorithm> #include <iostream> #include <cstring> #defin…
题目链接 Solution 直接考虑单调栈处理出每一个点作为最小值的区间长度. 然后 \(O(n)\) 找一遍最大值即可. 记得开 long long,以及要注意 \(0\) 的问题. Code #include<bits/stdc++.h> #define ll long long #define N 2000001 #define in(x) x=read() using namespace std; ll n,a[N]; ll L[N],R[N],sta[N],top; ll read(…
[POI 2008&洛谷P3467]PLA-Postering Description Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长的,从东向西延伸的建筑物链(建筑物的高度不一). Byteburg市的市长Byteasar,决定将这个建筑物链的一侧用海报覆盖住.并且想用最少的海报数量,海报是矩形的. 海报与海报之间不能重叠,但是可以相互挨着(即它们具有公共边),每一个海报都必须贴近墙并且建筑物链的整个一侧必须被覆盖(意思是:海报需要将一…
题目:https://www.luogu.org/problemnew/show/P1233 题意: 有n根木棍,每根木棍有长度和宽度. 现在要求按某种顺序加工木棍,如果前一根木棍的长度和宽度都大于现在这根,那加工这一根就不需要准备时间,否则需要1分钟准备时间. 问最少的准备时间. 思路: 现在题目要同时维护两个单调不升序列的数目.对于一个属性显然可以通过排序保证他们是单调不升的. 只需在排好序之后求另一个属性的单调不升序列的个数. 这里需要知道Dilworth定理: 偏序集能划分成的最少的全序…
题目:https://www.luogu.org/problemnew/show/P1020 题意: 给定一些导弹的高度. 一个导弹系统只能拦截高度不增的一系列导弹,问如果只有一个系统最多能拦截多少导弹. 再问,如果要拦截所有导弹最少需要多少系统. 思路: 对于第一个问题其实就是找整个序列中的最长不升子序列. 对于第二个问题就是找整个序列中的最长上升子序列.因为当有一个高度大于前面的高度时一个系统就搞定不了了. 最长上升子序列用动态规划是可以做的,但是这题会卡. $O(N^2)$的动规做法是,$…
要求我们去找一个最大矩形面积. 单调栈做法(和P1950 长方形那道题类似(一模一样)). 1 #include<bits/stdc++.h> 2 using namespace std; 3 char M[1010][1010]; 4 int n,m,h[1010],l[1010],r[1010]; 5 int s[1010],top; 6 7 void ddzl(){ 8 top=0; 9 for(int i=m;i>=1;i--){ 10 while(top!=0 &&am…
P2659 美丽的序列 tag 笛卡尔树 题意 找出一个序列的所有子段中子段长度乘段内元素最小值的最大值. 思路 我们需要找出所有子段中贡献最大的,并且一个子段的贡献为其长度乘区间最小值. 这--不就是裸的笛卡尔树吗? 建出符合小根堆性质的笛卡尔树,递归所有点,更新答案即可. 因为这是一道裸题,所以我记录一下建笛卡尔树的模板.(从OI wiki上扣的) 思路是用一个单调栈维护一下右链. 伪代码: 新建一个大小为 n 的空栈.用 top 来标操作前的栈顶,k 来标记当前栈顶. For i := 1…