rt
不知道哪里挂掉了啊(我看了半天都没看出问题,错误的数据又太大,几万QwQ)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1e6+10;
int n,a[MAXN*2],sum[MAXN*2];
int head=1,rear=2,ans;
struct Node{
int num,value;
}queue[MAXN*2];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i+n]=a[i];
}
for(int i=1;i<=2*n;i++){
sum[i]=sum[i-1]+a[i];
}
queue[1]=(Node){1,1.5e9};
for(int i=1;i<=n;i++){
if(sum[i] <= queue[1].value){
queue[1]=(Node){i,sum[i]};
}
}
if(queue[1].value >= 0)ans++;
for(int k=2;k<=n;k++){
//k~k+n-1,找出这里面前缀和sum最小的一个,判断其减去k是否大于等于0
while(head<rear){
if(queue[head].num < k){
head++;
continue;
}
break;
}
while(head<rear){
if(queue[rear-1].value >= sum[k+n-1]){
rear--;
continue;
}
break;
}
queue[rear++]=(Node){k+n-1,sum[k+n-1]};
if(queue[head].value - sum[k-1] >= 0){
ans++;
}
}
cout<<ans<<endl;
return 0;
}