Jak ruszyć tego typu zadanie?

0

Mowa o zadaniu: http://pl.spoj.com/problems/FR_01_06/ ,napisałem bruta, ale kompletnie nie wiem jak to ruszyć aby wyszło coś sensownego. Proszę o jakieś słowa kluczowe, wskazówki itp, jak się za to w ogóle zabrać.

0

Ehh.. mam problem, wydaje mi się, że robie wszystko dobrze, napisałem prosty generator testów i sprawdziłem czy wychodzi ok, ale dostaje błędna odpowiedź. Siedzę nad tym już kilka dni i nie mam pomysłu, wytni mi ktoś błąd:

#include <algorithm>
#include <ctime>
#include <cstdio>
#include <cmath>
using namespace std;

int n, c[1000001], q, o, a, b, v;
int tmin[1010], tmax[1010], p, r;

void minmax(int a, int b, int& min, int& max)
{
    if (a == b) min = max = c[a];
    else
    {
        if (c[a] > c[a+1]) { min = c[a+1]; max = c[a]; }
        else { min = c[a]; max = c[a+1]; }
        for (int i = a + 2; a < b; a += 2)
        {
            if (c[i] > c[i+1])
            {
                if (c[i]   > max) max = c[i];
                if (c[i+1] < min) min = c[i+1];
            }
            else
            {
                if (c[i+1] > max) max = c[i+1];
                if (c[i]   < min) min = c[i];
            }
        }
        if ((b-a)%2 == 0)
        {
            if (c[b] > max) max = c[b];
            if (c[b] < min) min = c[b];
        }
    }
}

int count(int a, int b)
{
    if (a == b) return 0;

    int min, max, smin, smax;
    min = max = c[a];
    if ((a % p != 0) && ((b+1) % p != 0) && (a/p == b/p))
    {
        minmax(a, b, min, max);
        return max - min;
    }
    if (a % p != 0)
    {
        int b = ((a/p)*p)+p-1;
        minmax(a, b, smin, smax);
        if (smin < min) min = smin;
        if (smax > max) max = smax;
        a = b + 1;
    }
    if ((b+1) % p != 0)
    {
        int a = (b/p)*p;
        minmax(a, b, smin, smax);
        if (smin < min) min = smin;
        if (smax > max) max = smax;
        b = a - 1;
    }
    while (a < b)
    {
        if (tmin[a/p] < min) min = tmin[a/p];
        if (tmax[a/p] > max) max = tmax[a/p];
        a += p;
    }

    return max - min;
}

void add(int a, int b, int v)
{
    for (int i = a; i <= b; i++) c[i] += v;

    int min, max;
    if ((a % p != 0) && ((b+1) % p != 0) && (a/p == b/p))
    {
        int aa = (a/p)*p, bb = aa+p-1;
        minmax(aa, bb, min, max);
        tmin[a/p] = min;
        tmax[a/p] = max;
        return;
    }
    if (a % p != 0)
    {
        int aa = (a/p)*p, bb = aa+p-1;
        minmax(aa, bb, min, max);
        tmin[a/p] = min;
        tmax[a/p] = max;
        a = bb + 1;
    }
    if ((b+1)%3 != 0)
    {
        int aa = (b/p)*p, bb = aa+p-1;
        minmax(aa, bb, min, max);
        tmin[b/p] = min;
        tmax[b/p] = max;
        b = aa - 1;
    }
    while (a < b)
    {
        tmin[a/p] += v;
        tmax[a/p] += v;
        a += p;
    }
}

int main()
{
    scanf("%d", &n);
    p = sqrt(n);

    for (int i = 0; i < n; i++)
    {
        scanf("%d", c + i);

        if (i % p == 0) tmin[i/p] = tmax[i/p] = c[i];
        if (c[i] < tmin[i/p]) tmin[i/p] = c[i];
        else if(c[i] > tmax[i/p]) tmax[i/p] = c[i];
    }

    scanf("%d", &q);
    while (q--)
    {
        scanf("%d%d%d", &o, &a, &b);
        if (o == 0) printf("%d\n", count(a-1, b-1));
        else
        {
            scanf("%d", &v);
            add(a-1, b-1, v);
        }
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1