Cod sursa(job #1720569)

Utilizator Mihai7Gheoace Mihai Mihai7 Data 22 iunie 2016 20:16:45
Problema Subsecventa de suma maxima Scor 75
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 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;
char buff[4096];
int pos= 4096;
inline char getch()
{
	if(pos==4096)
	{
		fread(buff,1,4096,stdin);
		pos=0;
	}
	return buff[pos++];
}
inline int nextNumber()
{
	char c=getch();bool sign=0;
	while(c<'0' || c>'9')
		{
			if(c=='-')
				sign=1;
			c=getch();
		}
	int nr=0;
	while(c>='0' && c<='9')
		{nr=nr*10+c-'0';
		c=getch();
		}
	if(sign)
		nr*=-1;
	return nr;
}
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)
		a[i]=nextNumber();
	int finalV=getMaxSubsequence(0,n-1,pos1,pos2);
	printf("%d %d %d" ,finalV,pos1+1,pos2+1);
}