知识点:思维,单调队列
难度:4
首先我们读题这个要用到前缀和,其次,我们发现其实题目的答案的范围就在1到n之间,让我们在n个长度为n的区间里面找答案,如果暴力,肯定会超时,这里用到了一种技巧,虽然没有接触过构造,但是我觉得这个算是构造,那就是在后面补上n-1个数,这样就可以断环为链,空间是原来的2倍,在这个序列上用单调队列想必就很明了了,在上面找严格区间长度为n的区间的最小值减去前面的前缀和是不是大于等于0的个数就可以了,需要注意的就是我们统计答案的时候要减去前面的前缀和,这个不要漏了,
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
int a[N], b[N];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = n + 1; i <= 2 * n - 1; i++) a[i] = a[i - n];
for (int i = 1; i <= 2 * n - 1; i++) b[i] = b[i - 1] + a[i];
deque<int> q;
int ans = 0;
for (int i = 1; i <= 2 * n - 1; i++) {
if (!q.empty() && q.front() + n == i) q.pop_front();
while (!q.empty() && b[i] <= b[q.back()]) q.pop_back();
q.push_back(i);
if (i >= n && b[q.front()] - b[i - n] >= 0) ans++;
}
cout << ans;
return 0;
}