Cod sursa(job #682733)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 19 februarie 2012 14:20:16
Problema Subsecventa de suma maxima Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;

int v[6000005], s[6000005], n, sol, xs, ys;

pair < int, pair < int, int > > divide(int a, int b)
{
    int i, x, y, curr, maxim = -0x3f3f3f3f, maxim2 = -0x3f3f3f3f;
    //cerr << a << ' ' << b << "\n";
    if(b - a == 0)
        return make_pair(v[a], make_pair(a, b));
    pair <int, pair <int, int > > left, right;
    left = divide(a, (a + b) / 2);
    right = divide((a + b) / 2 + 1, b);
    for(i = a; i <= b; ++i) {
        if(s[i] - s[a - 1] > maxim) {
            maxim = s[i] - s[a - 1];
            x = i;
        }
    }
    for(i = b; i >= a; --i)
        if(s[b] - s[i - 1] > maxim2) {
            maxim2 = s[b] - s[i - 1];
            y = i;
        }
    //cerr << y << ' ' << a << ' ' << b << "\n";
    int leftSum = s[(a + b) / 2] - s[left.second.second - 1];
    int rightSum = s[right.second.first] - s[(a + b) / 2];

    curr = max(left.first, max(right.first, leftSum + rightSum));
    if(curr > sol) {
        sol = curr;
        xs = left.second.second;
        ys = right.second.first;
    }
    //cerr << a << ' ' << b << ' ' << curr << "\n";
    return make_pair(curr, make_pair(x, y));

}

int main()
{
    int i;
    freopen ("ssm.in", "r", stdin);
    freopen ("ssm.out", "w", stdout);
    scanf("%d", &n);
    for(i = 1; i <= n; ++i)
        scanf("%d", &v[i]);
    for(i = 1; i <= n; ++i)
        s[i] = s[i - 1] + v[i];
    divide(1, n);
    printf("%d %d %d", sol, xs, ys);
    return 0;
}