单调队列85分求助
查看原帖
单调队列85分求助
340632
Cry_For_theMoon楼主2020/8/19 15:13

rt

不知道哪里挂掉了啊(我看了半天都没看出问题,错误的数据又太大,几万QwQ)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1e6+10;
int n,a[MAXN*2],sum[MAXN*2];
int head=1,rear=2,ans;
struct Node{
	int num,value;
}queue[MAXN*2];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i+n]=a[i];
	}
	for(int i=1;i<=2*n;i++){
		sum[i]=sum[i-1]+a[i];
	}
	queue[1]=(Node){1,1.5e9};
	for(int i=1;i<=n;i++){
		if(sum[i] <= queue[1].value){
			queue[1]=(Node){i,sum[i]};
		}
	}
	if(queue[1].value >= 0)ans++;
	for(int k=2;k<=n;k++){
		//k~k+n-1,找出这里面前缀和sum最小的一个,判断其减去k是否大于等于0 
		while(head<rear){
			if(queue[head].num < k){
				head++;
				continue;
			}
			break;
		}
		while(head<rear){
			if(queue[rear-1].value >= sum[k+n-1]){
				rear--;
				continue;
			}
			break;
		}
		queue[rear++]=(Node){k+n-1,sum[k+n-1]};
		if(queue[head].value - sum[k-1] >= 0){
			ans++;
		} 
	}
	cout<<ans<<endl;
	return 0;
} 
2020/8/19 15:13
加载中...