Cod sursa(job #612329)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 6 septembrie 2011 21:10:18
Problema Subsecventa de suma maxima Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 2.56 kb
#include<stdio.h>
#include<limits.h>

#define N 6000005

struct secv {
    int start;
    int end;
    int sum;
};
int A[N];
int n;

void read() {
    freopen("ssm.in","r",stdin);
    freopen("ssm.out","w",stdout);
    scanf("%d",&n);
    for(int i = 1; i <= n; i++)
        scanf("%d",&A[i]);
}
secv convertSecv(int start, int end, int sum) {
    secv aux;
    aux.start = start;
    aux.end = end;
    aux.sum = sum;
    return aux;
}
secv combine(int st, int end) {
    int mid = (st + end) / 2;

    int pozleft = mid;
    int pozright = mid + 1;

    int i = mid;
    int j = mid + 1;

    int sumleft = 0;
    int maxleft = LONG_MIN;

    int sumright = 0;
    int maxright = LONG_MIN;

    while(i >= st) {
        sumleft += A[i];
        if (maxleft < sumleft) {
            maxleft = sumleft;
            pozleft = i;
        }
        i--;
    }
    while(j <= end) {
        sumright += A[j];
        if (maxright < sumright) {
            maxright = sumright;
            pozright = j;
        }
        j++;
    }
    return convertSecv(pozleft, pozright, maxleft + maxright);
}
secv solve(int st, int end) {
    if (st != end) {
        int mid = (st + end) / 2;
        secv left = solve(st, mid);
        secv right = solve(mid + 1, end);
        secv comb = combine(st, end);
        if ((left.sum > right.sum) && (left.sum > comb.sum)) return left;
        if ((right.sum > left.sum) && (right.sum > comb.sum)) return right;
        if ((comb.sum > left.sum) && (comb.sum > right.sum)) return comb;
        if ((left.sum == comb.sum) && (left.sum >= right.sum)) {
            if (left.start < comb.start) {
                return left;
            }
            else
             if ((left.start == comb.start) && (left.end < comb.end)) {
                 return left;
             }
              else
               return comb;
        }
        else
        if ((right.sum == comb.sum) && (right.sum >= left.sum)) {
            if (right.start < comb.start) {
                return right;
            }
            else
             if ((right.start == comb.start) && (right.end < comb.end)) {
                 return right;
             }
              else
               return comb;
        }
        else
         return left;
    }
    else {
        secv m = convertSecv(st, end, A[st]);
        return m;
    }
}
void writeresult(secv x) {
    printf("%d %d %d", x.sum, x.start, x.end);
}
int main() {
    secv result;
    read();
    result = solve(1, n);
    writeresult(result);
}