Cod sursa(job #2675752)

Utilizator MindralexMindrila Alex Mindralex Data 22 noiembrie 2020 14:37:51
Problema Subsecventa de suma maxima Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <fstream>
#include <climits>

using namespace std;

ifstream fin ("ssm.in");
ofstream fout ("ssm.out");

const int valMax = 6e6;

struct in
{
    int s, d;
};

int v[valMax+1], s[valMax+1], stm, drm, sm = 0, n;

void div (int st, int dr, int &rst, int &rdr)
{
    //cout << "st=" << st << ' ' << "dr=" << dr << '\n';
    if (st == dr)
    {
        rst = st;
        rdr = dr;
        //cout << "rst=" << rst << '\n';
        //cout << "rdr=" << rdr << '\n';
        return;
    }

    int mij = (st+dr)/2;
    //cout << "mij=" << mij << '\n';
    in ain;
    div (st, mij , ain.s, ain.d);
    int a = s[ain.d] - s[ain.s - 1];

    in bin;
    div (mij+1, dr, bin.s, bin.d);
    int b = s[bin.d] - s[bin.s - 1];

    int sumst = 0;
    int maxsumst = INT_MIN;
    int i;
    int maxindst = 0;
    for (i = mij; i >= 1; i--)
    {
        sumst += v[i];
        if (sumst > maxsumst)
        {
            maxsumst = sumst;
            maxindst = i;
        }
    }

    int sumdr = 0;
    int maxsumdr = INT_MIN;
    int maxinddr = 0;
    for (i = mij + 1; i <= n; i++)
    {
        sumdr =+ v[i];
        if (sumdr > maxsumdr)
        {
            maxsumdr = sumdr;
            maxinddr = i;
        }
    }

    int m = max(a, b);
    m = max (m, maxsumst+maxsumdr);
    if (m == a)
    {
        rst = ain.s;
        rdr = ain.d;
        return;
    }

    if (m == b)
    {
        rst = bin.s;
        rdr = bin.d;
        return;
    }
    rst = maxindst;
    rdr = maxinddr;
    return;

}

int main()
{
    fin >> n;
    for (int i = 1; i <= n ; i++)
    {
        fin >> v[i];
        s[i] = s[i-1] + v[i];
    }
    div (1, n, stm, drm);
    fout << s[drm] - s[stm-1] << ' ' << stm << ' ' << drm;
    return 0;
}