


首先有类似环上区间的问题,我们把原串复制一下,贴到原串后面,也就是倍长原串
然后计算一下前缀和,处理完成后,每次相当于一个长度为n的滑块,每次维护区间最小值,用这个值减去sum[l-1],如果小于等于0则说明不成立
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int n,a[maxn<<1],pre[maxn<<1],no[maxn<<1],q[maxn<<1],l,r;
int main()
{
freopen("genes.in","r",stdin);
freopen("genes.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),a[i+n]=a[i];
for(int i=1;i<=n*2;i++)
pre[i]=pre[i-1]+a[i];
int ans=0; l=1; r=0;
for(int i=1;i<n*2;i++)
{
while(pre[i]<q[r] && l<=r)
{
r--;
}
q[++r]=pre[i];
no[r]=i;
while(no[l]<=i-n) l++;
if(i>=n)
{
if(q[l]-pre[i-n]>=0) ans++;
}
}
printf("%d\n",ans);
return 0;
}
该博客介绍了如何利用滑动窗口和前缀和的方法解决区间最值问题。通过将原串复制并倍长,计算前缀和,然后维护一个最小值队列,动态更新区间,当区间最小值减去起始位置的前缀和大于0时,说明不满足条件。代码示例中展示了具体实现过程。
1253

被折叠的 条评论
为什么被折叠?



