非负和:
题解:
双写输入的数组,维护这个优先队列,使它的前缀和始终小于sum[i],则res++
代码:
#include<bits/stdc++.h>
using namespace std;
const int M=1000050;
int n,a[M*2],sum[M*2];
int idqu[M*2],sumqu[M*2];
int main()
{
while( scanf("%d",&n) != EOF)
{
for(int i=1; i<=n; i++) scanf("%d",&a[i]), a[i+n]=a[i];
sum[0]=0;
for(int i=1; i<=n*2; i++) sum[i]=sum[i-1]+a[i];
if(sum[n]<0){
printf("0\n");
continue;
}
int st=0,ed=0;
idqu[0]=0,sumqu[0]=0;
for(int i=1; i<=n; i++){
while(ed>st && sumqu[ed]>sum[i]) ed--;
ed++;
sumqu[ed]=sum[i];
idqu[ed]=i;
}
int res=0;
for(int i=1; i<=n; i++){
while(idqu[st]<=i && st<ed) st++;
while(ed>st && sumqu[ed]>sum[i+n]) ed--;
ed++;
sumqu[ed]=sum[i+n];
idqu[ed]=i+n;
if(sum[i]<=sumqu[st]) res++;
}
printf("%d\n",res);
}
return 0;
}