HDU 4193 单调队列

题意:

求长度为n的循环数组中,长度为n不重复连续大于0的数字和的个数

只需要维护长度大于n就行

#include	
using namespace std;
int a[2000002];
int q[2000002];
int main(){
	int n;
	while(~scanf("%d",&n) && n){
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i]);
			a[i+n]=a[i];
		}
		int m=n*2;
		for(int i=1;i<=n*2;i++){
			a[i]+=a[i-1];
		}
		int left=0,right=0;
		int ans=0;
		for(int i=1;ia[i]){
				right--;
			}
			q[right++]=i;
			if(i>=n && a[q[left]]>=a[i-n])
				ans++;
			if(i-q[left]>=n)
				left++;
		}
		printf("%d\n",ans);
	}
}

 

你可能感兴趣的:(单调队列)