主思想就是对每个,判断是否可行。

(1):

对于每个,首先判断是否满足。

考虑到可以递推,将循环,

表示的最小值

则易得

那么得到了,只需判断是否不小于即可。

(2):

后半部分对于的判断则更加简单。

预处理

其中

那么只要判断是否不小于

可。

总复杂度

#include<iostream>
#include<cstdio>
int read();
#define maxn 1000010
#define miin(a,b) ((a)<(b)?(a):(b))
using namespace std;

int n;
int a[maxn],s[maxn],mis[maxn];
int main(){
    n=read();
    mis[0]=2000000000;
    for(int i=1;i<=n;i++){
        a[i]=read();
        s[i]=s[i-1]+a[i];
        mis[i]=miin(mis[i-1],s[i]);
    }mis[0]=0;
    int no=0,Ans=0;
    for(int k=n;k>=1;k--){
        no=miin(a[k],no+a[k]);
        if(no>=0&&mis[k-1]+s[n]-s[k-1]>=0)Ans++;
    }
    cout<<Ans;
    return 0;
}
int read(){
    int s=0,k=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')k=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
    return s*k;
}

单调队列做法待补完(给自己讲的,请忽略此句)