HDU4193 Non-negative Partial Sums(单调队列)

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 #include <queue>

 5 using namespace std;

 6 const int INF =1<<27;

 7 struct node

 8 {

 9     int i,num;

10     node(){}

11     node(int a,int b){i=a;num=b;}

12     bool operator < (const node &aa) const

13     {

14         if(aa.num!=num) return num<aa.num;

15         return i>aa.i;

16     }

17 };

18 int an[1000010];

19 node arr[2000010];

20 int front,rear;

21 void push(node a)

22 {

23     while(front<=rear&&a<arr[rear]) rear--;

24     arr[++rear]=a;

25 }

26 int main()

27 {

28     int n,i,sum0,sum1;

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

30     {

31         sum0=front=rear=0;

32         push(node(-1,-INF));

33         for(i=0;i<n;i++)

34         {

35             scanf("%d",an+i);

36             sum1=sum0+an[i];

37             push(node(i,sum1));

38             sum0=sum1;

39         }

40         if(sum1<0)

41         {

42             printf("0\n");

43             continue;

44         }

45         int tmp=0,ans=0;

46         for(i=0;i<n;i++)

47         {

48             while(arr[front].i<i) front++;

49             if(arr[front].num-tmp>=0) ans++;

50             tmp+=an[i];

51             sum1=sum0+an[i];

52             push(node(n+i,sum1));

53             sum0=sum1;

54         }

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

56     }

57     return 0;

58 }

 

你可能感兴趣的:(part)