Cod sursa(job #2273370)

Utilizator anca.sotirAnca Sotir anca.sotir Data 31 octombrie 2018 14:38:49
Problema Subsecventa de suma maxima Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <bits/stdc++.h>
using namespace std;
ifstream f("ssm.in");
ofstream g("ssm.out");

int n;
vector <int> v;

struct raspuns
{
    int left, right, sum;
    bool operator<(raspuns & other)
    {
        if(sum<other.sum)
            return true;
        return false;
    }
};

raspuns divide(int left, int right)
{
    if(left==right)
    {
        raspuns r;
        r.left=left;
        r.right=right;
        r.sum=v[left];
        return r;
    }
    int mid=left+(right-left)/2;
    raspuns ans1=divide(left,mid);
    raspuns ans2=divide(mid+1,right);

    int aux=0;
    raspuns r1;
    r1.sum=0;
    for(int p=mid;p>=left;p--)
    {
        aux+=v[p];
        if(aux>r1.sum)
        {
            r1.sum=aux;
            r1.left=p;
        }
    }
    aux=0;
    raspuns r2;
    r2.sum=0;
    for(int p=mid+1;p<=right;p++)
    {
        aux+=v[p];
        if(aux>r2.sum)
        {
            r2.sum=aux;
            r2.right=p;
        }
    }
    raspuns ans3;
    ans3.sum=r1.sum+r2.sum;
    ans3.left=r1.left;
    ans3.right=r2.right;
    if(ans1<ans2)
    {
        if(ans2<ans3)
            return ans3;
        else return ans2;
    }
    else
    {
        if(ans1<ans3)
            return ans3;
        else return ans1;
    }
}

int main()
{
    f>>n;
    v.resize(n);
    for(int i=0;i<n;++i)
        f>>v[i];
    raspuns r=divide(0,n-1);
    g<<r.sum<<' '<<r.left+1<<' '<<r.right+1;
    return 0;
}