Cod sursa(job #1720557)

Utilizator Mihai7Gheoace Mihai Mihai7 Data 22 iunie 2016 19:36:57
Problema Subsecventa de suma maxima Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 6000001
#define INFINIT ((1<<31)-1)
int a[N],suf,pre,i,bestpre,bestsuf,bestr,bestl;
int p1,p2,aux;
int getMaxSubsequence(int l,int r,int &pos1,int &pos2)
{
	if(l==r)
		return a[l];
	int mid=(l+r)/2;
	int pl1,pl2,pr1,pr2;
	bestl=getMaxSubsequence(l,mid,pl1,pl2);
	bestr=getMaxSubsequence(mid+1,r,pr1,pr2);
	suf=pre=0;
	int raw=INFINIT;
	bestsuf=bestpre=-INFINIT;
	for(i=mid;i>=l;--i)
	{
		suf+=a[i];
		if(bestsuf<suf)
			{bestsuf=suf;p1=i;}
	}
	for(i=mid+1;i<=r;++i)
	{
		pre+=a[i];
		if(bestpre<pre)
			{bestpre=pre;p2=i;}
	}
	
	if(bestr>bestl)
		if(bestr>bestpre+bestsuf)
			pos1=pr1,pos2=pr2;//salvam indicii din bestr
			else pos1=p1,pos2=p2;//salvam indicii din suf si pre
		else if(bestl>bestpre+bestsuf)
				pos1=pl1,pos2=pl2;//salvam indicii  din bestl
				else if(bestl==bestpre+bestsuf)
						{
							if(pl1<p1)
							pos1=pl1,pos2=pl2;
							else if(pl1==p1 && pl2-pl1<p2-p1)
									pos1=pl1,pos2=pl2;
									else pos1=p1,pos2=p2;
						}
						else pos1=p1,pos2=p2;			
	return max(bestr,max(bestl,bestpre+bestsuf));
}
int main()
{
	FILE *f=freopen("ssm.in","r",stdin),
	*g=freopen("ssm.out","w",stdout);
	int pos1,pos2,n;
	scanf("%d",&n);
	for(i=0;i<n;++i)
		scanf("%d",&a[i]);
	int finalV=getMaxSubsequence(0,n-1,pos1,pos2);
	printf("%d %d %d" ,finalV,pos1+1,pos2+1);
}