t
a
g
:
tag :
tag: 单调栈
所有子区间
数据结构
线段树
传送门 :
题意 : 给定给一个数组 a [ ] a[] a[],询问是否满足
∀ i m a x ( a i , a i + 1... a j − 1 , a j ) ≥ a i + a i + 1 + . . . a j − 1 + a j \forall _i\ max(a_i,a_i+1...a_{j-1},a_j) \ge a_i+a_{i+1}+...a_{j-1}+a_j ∀i max(ai,ai+1...aj−1,aj)≥ai+ai+1+...aj−1+aj
数据范围 : t : 1 e 5 , n : 2 e 5 t :1e5,n:2e5 t:1e5,n:2e5
思路 :
显然的,我们并不能直接 n 2 n^2 n2的进行枚举区间
但是我们可以知道的是 m a x ( a [ l , r ] ) max(a[l,r]) max(a[l,r])
我们设 a [ x ] a[x] a[x]是上式求出来的值,那么他所能覆盖的区间必然是固定的即 L [ x ] , R [ x ] L[x],R[x] L[x],R[x]
L [ x ] L[x] L[x]表示左边大于 a [ x ] a[x] a[x]的第一个数的下标 R [ x ] R[x] R[x]表示右边大于 a [ x ] a[x] a[x]的第一个数的下标
这样子我们就可以求出来 a [ x ] a[x] a[x]所服务的区间 即 [ L [ x ] + 1 , R [ x ] − 1 ] [L[x]+1,R[x]-1] [L[x]+1,R[x]−1]
因此对于题中的式子我们就可以简化为 a [ x ] ≥ m a x ( s u m [ r ] − s u m [ l − 1 ] ) a[x]\ge max(sum[r]-sum[l-1]) a[x]≥max(sum[r]−sum[l−1])
即最大化 L [ x ] , R [ x ] L[x],R[x] L[x],R[x]里面的区间和,判断是否可行
十年 c f cf cf一场空,不开 l l ll ll见祖宗 因为对自己的线段树和单调栈不够自信, w a 2 wa2 wa2之后一直在看自己的代码到底是不是有漏洞
Q A Q QAQ QAQ完全没注意到 L L LL LL
code :
const int N = 2e5+10;
const ll INF = 1e18;
const double eps = 1e-5;
struct node{
int l,r;
ll minv;
ll maxv;
}tr[N*4];
int n;
ll pre[N];
ll L[N],R[N];
ll a[N];
void pushup(int u){
tr[u].maxv = max(tr[u
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?