{HDU}{4193}{Non-negative Partial Sums}

对数组进行预处理,由于是连续的可以在O(1)的时间进行判定查询,WA了N次。

#include <iostream>

#include <string>

#include <cstring>

#include <cstdio>

#include <algorithm>

#include <memory>

#include <cmath>

#include <bitset>

#include <queue>

#include <vector>

#include <stack>

using namespace std;



const int MAXN = 550;



#define CLR(x,y) memset(x,y,sizeof(x))

#define MIN(m,v) (m)<(v)?(m):(v)

#define MAX(m,v) (m)>(v)?(m):(v)

#define ABS(x) ((x)>0?(x):-(x))

#define rep(i,x,y) for(i=x;i<y;++i)

int minval[1200000];

int minvalf[1200000];

int s[1200000];

int b;



int work()

{

	int n;

	int i,j,tmp,k,h,val,p;

	while( scanf("%d",&n) && n ) {

		b = 0;

		rep(i,0,n){

			scanf("%d",&s[i]);

			s[i] += b;

			b = s[i];

		}

		val = (1<<30);

		for( i = n-1; i >= 0; --i) {

			if(s[i] < val){

				val = s[i];

			}

			minval[i] = val;

		}

		val = (1<<30);

		rep(i,0,n) {

			if( s[i] < val ) {

				val = s[i];

			}

			minvalf[i] = val;

		}

		int ans = 0;

		minval[n] = (1<<30);

		rep(i,0,n){

			val = minval[i+1];

			if( val - s[i] >= 0 && s[n-1]-s[i]+minvalf[i] >= 0 ) 

				++ans;

		}

		printf("%d\n",ans);

	}

	return 0;

}

int main()

{

	work();

	return 0;

}

 

你可能感兴趣的:(part)