Cod sursa(job #489277)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 2 octombrie 2010 10:20:03
Problema Euro Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 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, 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;
		}

		a = make_pair(s, i-1);
		while (Q.size() >= 1){
			b = Q.back();
			if ( ok(b, a) ){
				Q.pop_back();
				a.first =a.first + b.first;
			}
			else 
				break;
		}
		Q.push_back(a);
	}

	s=0;
	for (i=0; i<Q.size(); ++i){
		a = Q[i];
		s=s + a.first * a.second - T;
	}

	printf("%lld\n", s);
	fclose(stdin); fclose(stdout);
	return 0;
}