tozangezan's diary

勝手にソースコードをコピペして利用しないでください。

PKU4040 Non-negative Partial Sums

こんなのsegment treeでO(n log n)で余裕だな!とやってたらずっとTLEしていて頭が悪い…
[0,a]と[b,n]のクエリしか使わないんだから線形でしょうに・・・

#include<stdio.h>
#include<algorithm>
using namespace std;
int b[1100000];
char str[5000000];
int sz;
int c[1048576];
int R[1048576];
int main(){
	int a;
	while(1){
		int at=0;
		int tmp=0;
		int nega=1;
		a=0;
		gets(str);
		for(int i=0;str[i];i++)a=a*10+str[i]-'0';
		if(a==0)return 0;
		gets(str);
		for(int i=0;at<a;i++){
			if(str[i]=='-')nega=-1;
			else if(str[i]>'9'||str[i]<'0'){
				b[at++]=nega*tmp;
				tmp=0;
				nega=1;
			}else{
				tmp=tmp*10+str[i]-'0';
			}
		}
		int now=0;
		c[0]=0;
		for(int i=0;i<a;i++){
			now+=b[i];
			c[i+1]=now;
		}
		tmp=c[a];
		for(int i=a;i>=1;i--){
			R[i]=tmp;
			tmp=min(tmp,c[i-1]);
		}
		int ret=0;
		int val=0;
		for(int i=0;i<a;i++){
			if(R[i+1]-c[i]>=0&&c[a]-c[i]+val>=0)ret++;
			val=min(val,c[i+1]);
		}
		printf("%d\n",ret);
	}
}