P2659 美丽的序列】的更多相关文章

P2659 美丽的序列对于当前的最小值,找到最大的左右边界,然后更新答案.用单调队列确定左右边界,O(n)做法. #include<iostream> #include<cstdio> #include<queue> #include<algorithm> #include<cmath> #include<ctime> #include<set> #include<map> #include<stack&…
P2659 美丽的序列 题目背景 GD是一个热衷于寻求美好事物的人,一天他拿到了一个美丽的序列. 题目描述 为了研究这个序列的美丽程度,GD定义了一个序列的"美丽度"和"美丽系数":对于这个序列的任意一个区间\([l,r]\),这个区间的"美丽度"就是这个区间的长度与这个区间的最小值的乘积,而整个序列的"美丽系数"就是它的所有区间的"美丽度"的最大值.现在GD想要你帮忙计算这个序列的"美丽系数&q…
P2659 美丽的序列 单调栈维护区间最小值,单调递增栈维护区间最小值, 考虑当前数对答案的贡献,不断加入数,如果加入的数$>$栈顶,说明栈顶的元素对当前数所在区间是有贡献的,同时加入当前的数. 反之,若当前加入的数比栈顶元素小,那么栈顶元素(所谓的最小值)已经失去了价值,因为他不会再对后面的区间造成影响,所以弹出栈顶,同时更新$ans$ #include<iostream> #include<cstdio> #include<algorithm> #define…
P2659 美丽的序列 题目链接 https://www.luogu.org/problemnew/show/P2659 题目描述 为了研究这个序列的美丽程度,GD定义了一个序列的"美丽度"和"美丽系数":对于这个序列的任意一个区间[l,r],这个区间的"美丽度"就是这个区间的长度与这个区间的最小值的乘积,而整个序列的"美丽系数"就是它的所有区间的"美丽度"的最大值.现在GD想要你帮忙计算这个序列的&quo…
P2659 美丽的序列 tag 笛卡尔树 题意 找出一个序列的所有子段中子段长度乘段内元素最小值的最大值. 思路 我们需要找出所有子段中贡献最大的,并且一个子段的贡献为其长度乘区间最小值. 这--不就是裸的笛卡尔树吗? 建出符合小根堆性质的笛卡尔树,递归所有点,更新答案即可. 因为这是一道裸题,所以我记录一下建笛卡尔树的模板.(从OI wiki上扣的) 思路是用一个单调栈维护一下右链. 伪代码: 新建一个大小为 n 的空栈.用 top 来标操作前的栈顶,k 来标记当前栈顶. For i := 1…
题目背景 GD是一个热衷于寻求美好事物的人,一天他拿到了一个美丽的序列. 题目描述 为了研究这个序列的美丽程度,GD定义了一个序列的“美丽度”和“美丽系数”:对于这个序列的任意一个区间[l,r],这个区间的“美丽度”就是这个区间的长度与这个区间的最小值的乘积,而整个序列的“美丽系数”就是它的所有区间的“美丽度”的最大值.现在GD想要你帮忙计算这个序列的“美丽系数”. 输入输出格式 输入格式: 第一行一个整数n,代表序列中的元素个数. 第二行n个整数a1.a2„an,描述这个序列. 输出格式: 一…
题目 该题目可以用辅助数组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(…
传送门 单调栈大水题 l[i] 表示 i 能扩展到的左边 r[i] 表示 i 能扩展到的右边 ——代码 #include <cstdio> #include <iostream> #define LL long long ; int n, t; LL ans, a[MAXN], s[MAXN], l[MAXN], r[MAXN]; inline int read() { , f = ; char ch = getchar(); ; ) + (x << ) + ch -…
题意:给定$n,k$,对于整数对序列$\left(a_1,b_1\right),\cdots,\left(a_k,b_k\right)$,如果$1\leq a_1\leq b_1\lt a_2\leq b_2\lt\cdots\lt a_k\leq b_k\leq n$且所有的$b_i-a_i$互不相同,则称这个序列是“美丽的”,求美丽的序列的个数 先转化一下,把每个数对$\left(a_i,b_i\right)$看作一个区间$\left[a_i,b_i\right]$,则题目要求的是$k$个长…