UVALive 6609 Minimal Subarray Length(最大子段)

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4620

区间左右更新

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
#define N 510000
#define INF 0x3f3f3f3f
#define met(a, b) memset(a, b, sizeof(a))
const double EPS = 1e-8;
typedef long long LL;

LL a[N], k;
int len;

struct node
{
    int l;///区间左端
    LL sum;
}p[N];

void Solve (int l, int r)
{
    LL sum = 0, s = p[r].sum;///区间最大值

    if (s<k) return;

    while (l < r)
    {
        sum += a[l];

        if (s-sum >= k)
        {
            p[r].sum = s-sum;
            p[r].l = l+1;///更新区间左端

        }
        l++;
    }
    len = min (len, r-p[r].l+1);
}

int main ()
{
    int t, n;
    scanf ("%d", &t);

    while (t--)
    {
        met (a, 0);
        met (p, 0);

        scanf ("%d %lld", &n, &k);

        p[0].l = 1, len = INF;

        for (int i=1; i<=n; i++)
        {
            scanf ("%lld", &a[i]);
            if (p[i-1].sum>0)
            {
                p[i].sum = a[i]+p[i-1].sum;
                p[i].l = p[i-1].l;
            }
            else
            {
                p[i].sum = a[i];
                p[i].l = i;
            }

            Solve (p[i].l, i);
        }

        if (len==INF) len = -1;
        printf ("%d\n", len);
    }
    return 0;
}


你可能感兴趣的:(UVALive 6609 Minimal Subarray Length(最大子段))