Cod sursa(job #822863)

Utilizator antonioteoZait Teodor Antonio antonioteo Data 24 noiembrie 2012 09:46:01
Problema Subsecventa de suma maxima Scor 85
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
// Implementare dupa Stroe Marius 
// SSM - Divide et impera - 85 pct 
#include <fstream>
#define mx 7000004
using namespace std;
const char iname[] = "ssm.in";
const char oname[] = "ssm.out";
ifstream f(iname); 
ofstream g(oname);
int a[mx] , n , Smax = -int(2e9) , in , sf;
inline void div_imp ( int st , int dr )
{
	if ( st == dr )
	{
		if ( Smax < a[ dr ] )
			Smax = a[ dr ] , in = sf = dr;
		return ;
	}
	// I - Divide 
	int mij = ( st + dr ) / 2;
	div_imp ( st , mij );
	div_imp ( mij + 1 , dr );
	// II - Conquer
	int st2 , dr2 , Sact = 0 , before = 0;
	int max_Sact = -int(1e9) , max_before = -int(1e9);
	for ( int i = mij; i >= st; --i )
	{
		Sact += a[ i ];
		if ( max_Sact <= Sact ) max_Sact = Sact , st2 = i;
	}
	for ( int i = mij + 1; i <= dr; ++i )
	{
		before += a[ i ];
		if ( max_before < before ) max_before = before , dr2 = i;
	}
	// III - Conditie_Veritas
	if ( max_before + max_Sact > Smax )
		Smax = max_before + max_Sact , in = st2 , sf = dr2;
}
int main()
{
	f >> n;
	for ( int i = 1; i <= n; ++i ) f >> a[ i ];
	div_imp ( 1 , n );
	g << Smax << ' ' << in << ' ' << sf << '\n';
	return 0;
}