单调队列85分 求助
查看原帖
单调队列85分 求助
224931
CSP_Sept楼主2021/7/6 13:46

rt

做法是朴素的断环为链,但只有 85pts\tt85pts

Code:

#include <cstdio>

#define N 2000010
#define int long long
using namespace std;
int k, n;
struct Node{
	int ind, num;
};
Node q[N];
int a[N], u[N];
int l = 1, r = 0, ans = 0;
inline int rd();
signed main(){
	n = rd();
	for(int i = 0 ; i < n ; i++) u[i] = rd(), u[i + n] = u[i];
	a[0] = u[0];
	for(int i = 1 ; i < 2 * n ; i++) a[i] = a[i - 1] + u[i];
	for(int i = 0 ; i < 2 * n ; i++){
		int tmp = a[i];
		if(q[l].ind + n <= i) l++;
		while(l <= r && q[r].num >= tmp)
		    r--;
		r++;
		q[r].num = tmp;
		q[r].ind = i;
		if(i == n - 1 && q[l].num >= 0) ans++;
		if(i >= n){
			if(q[l].num - a[i - n] >= 0) ans++;
		}
	}
	printf("%lld\n", ans);
	return 0;
}
inline int rd(){
	char c;
	bool flag = 0;
	while((c = getchar()) < '0' || c > '9')
	    if(c == '-') flag = 1;
	int res = c - '0';
	while((c = getchar()) >= '0' && c <= '9')
	    res = (res << 3) + (res << 1) + c - '0';
	return flag ? -res : res;
}

/kel

2021/7/6 13:46
加载中...