https://www.luogu.org/problemnew/show/P2629
题目中文的,不说了;
做法:这道题就不是裸的单调队列了,这道题因为是一个环首先把他,连在一起,然后求一个前缀和sum;
对于每一个点k如果满足题目要求,则在sum[k]到sum[k+n-1],这个范围内,最小值减去sum[k-1]应该是大于0的
所以就可以用单调栈维护了,当然线段树哪些也可以;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=2e6+10;
int n,m,a[N],sum[N];
int que[N],head,tail,id[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],a[i+n]=a[i];
sum[0]=0;
for(int i=1;i<=2*n;i++) sum[i]=sum[i-1]+a[i];
int ans=0;
head=1,tail=0;
for(int i=1;i<n;i++)
{
while(head<=tail&&que[tail]>=sum[i]) tail--;
que[++tail]=sum[i],id[tail]=i;
}
for(int i=n;i<2*n;i++)
{
while(head<=tail&&que[tail]>=sum[i]) tail--;
que[++tail]=sum[i],id[tail]=i;
while(id[head]<i-n+1) head++;
if(que[head]-sum[i-n]>=0) ans++;
}
cout<<ans<<endl;
return 0;
}