主思想就是对每个,判断是否可行。
(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;
}单调队列做法待补完(给自己讲的,请忽略此句)

京公网安备 11010502036488号