Cod sursa(job #2273363)

Utilizator ScarymovieMocanu Alexandru Scarymovie Data 31 octombrie 2018 14:33:20
Problema Subsecventa de suma maxima Scor 75
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include<vector>
using namespace std;
vector<int> v;
struct secv {
    int sum,start,finish;
    secv(int a,int b,int c) : sum(a),start(b),finish(c){}
};
int n;
ifstream f("ssm.in");
ofstream g("ssm.out");
secv divide(int left,int right)
{
    if(left==right) {return {v[left],left,left};}
    else {
        int mid=left+(right-left)/2;
        secv ans1=divide(left,mid);
        secv ans3=divide(mid+1,right);
        int Max=v[mid],s=v[mid],indice=mid;
        for(int i=mid-1;i>=left;--i)
            if((s+=v[i])>=Max) {
                Max=s;
                indice=i;
            }
        int Max2=v[mid+1],s2=v[mid+1],indice2=mid+1;
        for(int i=mid+2;i<=right;++i)
            if((s2+=v[i])>=Max2) {
                Max2=s2;
                indice2=i;
            }

        secv ans2(Max+Max2,indice,indice2);
        if(ans1.sum>ans2.sum)
        {
            if(ans3.sum>ans1.sum) return ans3;
            return ans1;
        }
        if(ans2.sum>ans1.sum)
        {
            if(ans3.sum>ans2.sum) return ans3;
            return ans2;
        }
        if(ans3.sum>ans2.sum) return ans3;
        if(ans1.start<ans2.start) return ans1;
        if(ans2.start<ans1.start) return ans2;
        return ans2;
    }
}
int main()
{
    f>>n;
    v.resize(n);
    for(int i=0;i<n;++i) f>>v[i];
    secv ans=divide(0,n-1);
    g<<ans.sum<<' '<<ans.start+1<<' '<<ans.finish+1<<'\n';
    return 0;
}