Cod sursa(job #489286)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 2 octombrie 2010 10:33:11
Problema Euro Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <stdio.h>
#include <algorithm>
#include <vector>

#define MAXN 35000
#define per pair<long long, long long>

using namespace std;

long long A[MAXN];
long long s;
int i, j, N;
long long T;
per a,b;

inline bool ok(const per &a, const per &b)
{
	return (a.first * a.second - T) <= (a.first * b.second);
}

int main()
{
	freopen("euro.in","r",stdin);
	freopen("euro.out","w",stdout);

	scanf("%d %lld",&N,&T);
	for (i=1; i<=N; ++i)
		scanf("%lld",A+i);
	
	vector<per> Q;
	for (i=1; i<=N;){
		s=0;
		while (s>=0 && i<=N){
			s+=A[i]*1LL;
			++i;
		}

		Q.push_back( make_pair(s, i-1) );
	}

	memset(A, 0, sizeof(A));

	N = Q.size();
	A[0] = 0;
	for (i=0; i<N; ++i){
		a = Q[i];
		A[i+1] = A[i] + a.first * a.second - T;
		for (j=i-1; j>=0 && (j-i)*(j-i) <= T+10; --j){
			a.first += Q[j].first;
			A[i+1] = max(A[i+1], A[j]+a.first*a.second-T);
		}
	}

	printf("%lld\n", A[N]);
	fclose(stdin); fclose(stdout);
	return 0;
}