Pagini recente » Cod sursa (job #178048) | Rating Anda Pop (popanda) | Cod sursa (job #2869871) | Istoria paginii runda/ioitrunda3/clasament | Cod sursa (job #2820846)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("ssm.in");
ofstream g("ssm.out");
int n,ss,s[6000010],minn,maxx,poz1,poz2,a[6000010],v[6000010],scalc;
int main()
{
f>>n;
ss=0;
//cout<<"sumele:\n";
for(int i=0;i<n;i++)
{
f>>a[i];
ss+=a[i];
s[i]=ss;
// cout<<a[i]<<" ";
}
//cout<<"\n";
minn=0;
v[0]=-1;
//poz1=0;
//poz2=0;
for(int i=1;i<n;i++)
{
if(s[minn]>s[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=s[i]-s[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)
*/