一环状的数组,求满足:从某一位置开始任意长度的元素和都大于等于0
既然数组是循环的,自然想到先复制一遍,然后求sum[i],
枚举每一个长度为n的区间,看最小值是否满足即可。
很明显可以线段树解决,但是 单调队列在这里的适用性更强
#include <stdio.h>
#define N 2000002
int a[N],sum[N],que[N];
int main()
{
int i,n;
while(scanf("%d",&n) == 1 && n)
{
for(i = 1; i <= n; ++i)
{
scanf("%d",a + i);
a[i + n] = a[i];
}
int nn = n << 1;
for(i = 1; i <= nn; ++i)
sum[i] = sum[i-1] + a[i];
int head = 0,tail = 0;
int res = 0;
for(i = 1; i < nn; ++i)
{
while(head < tail && sum[i] < sum[que[tail-1]])
--tail;
que[tail++] = i;
这篇博客探讨了如何利用单调队列来解决一个环状数组的问题,其中要求从数组的任意位置开始,任意长度的连续元素之和都大于等于0。作者指出,可以通过复制数组并计算子序列和,然后枚举区间长度,用单调队列来高效地检查最小值是否满足条件。
订阅专栏 解锁全文
651

被折叠的 条评论
为什么被折叠?



