D Difference (二分 + 单调队列)
https://ac.nowcoder.com/acm/contest/34866/D
题意
给你长度为n的序列 和一个k
一个区段值满足: f(l, r) = (max - min) * (r - l + 1); 其中max min是区间最大最小值
要求输出第k大的区间值
思路
因为数据比较大 容易超时 可以考虑二分答案
然后去判断对于一个答案有几个大于等于它的 找到存在k个大于等于它的答案
(二分答案的复杂度是OlogV)
寻找一个大于等于ans的区间值的个数 可以考虑用单调队列
对于一个区间如果r固定[l, r]的区间值肯定比[l-1, r]大 因为[l, r]覆盖[l-1, r]前一个区间的区间长度比后一个大 而max-min肯定大于等于后一个区间
而要求某个区间的最大最小值 可以用单调队列分别维护
固定有边界 然后每次找到左边界最右的且满足区间值等于当前二分的答案 的l 对于这个右边界 贡献就是l
遍历右边界1-n 将贡献累加起来 与k做比较即可
#include
#include
#include
#include