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