Cod sursa(job #2820914)

Utilizator nushLaura Maria nush Data 21 decembrie 2021 20:43:14
Problema Subsecventa de suma maxima Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("ssm.in");
ofstream g("ssm.out");
int n,ss,minn,maxx,poz1,poz2,a[6000005],v[6000005],scalc;
int main()
{
    f>>n;
    ss=0;
    //cout<<"sumele:\n";
    for(int i=0;i<n;i++)
    {
        f>>a[i];
        ss+=a[i];
        a[i]=ss;
       // cout<<a[i]<<" ";
    }
    //cout<<"\n";
    minn=0;
    v[0]=-1;
    //poz1=0;
    //poz2=0;
    for(int i=1;i<n;i++)
    {
        if(a[minn]>a[i])
        {
            v[i]=-1;
            minn=i;
            //poz1[i]=minn;
        }

        else
        {
            v[i]=minn;
            //poz1=minn;
        }

    }
    //for(int i=0;i<n;i++)
        //cout<<a[i]<<" ";
    //cout<<"\n";
    for(int i=0;i<n;i++)
    {
        scalc=a[i]-a[v[i]];
        //cout<<scalc<<" ";
        if(maxx<scalc)
        {
            maxx=scalc;
            poz1=v[i]+1;
            poz2=i;
        }
    }
    //cout<<"kkk"<<v[5];
    g<<maxx<<" "<<poz1+1<<" "<<poz2+1;





    return 0;
}
/*
Cerinta:
https://www.infoarena.ro/problema/ssm
Sol 2
Avem
5 -6 3 4 -2 3 -3
si ca sa aflam subsecventa de suma max
-facem suma de la 1 la poz respectiva(i) pt toate pozitiile (cu un for) -o notez cu s
-> complexitate:O(n)
ceva de genu:
5 -1 2 6  4 7  4
obs!
suma de la poz i la j (i<j) este s[j]-s[i];
obs!
ca sa calculez subsecventa de suma max care se termina pe i:
    s[_,i]=max(s[i]-s[0],s[i]-s[1],...s[i]-s[i-1])
    s[_,i]=s[i]-min(s[0],s[1],...s[i-1])
    s[_,i]=s[i]-min(s[j]), unde j<i;
-calculam minimul de la 1 la i pt fiecare pozitie din s (cu un for) si le bagam in v
-1 -1 1 1 1 1  1
-> complexitate:O(n)
-calculam pt fiecare s[i] (s vector de suma) s[i]-cea mai mica suma de la 1 la i
scalc=(s[i]-s[v[i]])
-facem maximul dintre toate scalc si tinem minte pozitiile in poz1 si poz2
-afisam maximul, poz1 si poz2
-> complexitate:O(n)
*/