Cod sursa(job #775190)

Utilizator darrenRares Buhai darren Data 7 august 2012 15:02:52
Problema Euro Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <cmath>
#include <fstream>
#include <algorithm>
#include <deque>

using namespace std;

const long long INF = 1LL << 60;
const int INFi = 0x3f3f3f3f;

int N, T;
int A[35000], S[35000];
long long maxC[35000];
deque<int> D;

inline int timego(const int& i1, const int& i2) // cand depaseste i1 pe i2
{
	if (S[i1] > S[i2]) return INFi;
	if (S[i1] == S[i2]) return (maxC[i1] >= maxC[i2] ? 0 : INFi);
	
	return ceil(1.0L * (maxC[i1] - maxC[i2]) / (S[i1] - S[i2]));
}

int main()
{
	ifstream fin("euro.in");
	ofstream fout("euro.out");
	
	fin >> N >> T;
	for (int i = 1; i <= N; ++i)
	{
		fin >> A[i];
		S[i] = S[i - 1] + A[i];
	}
	
	D.push_back(0);
	for (int i = 1; i <= N; ++i)
	{
		while (D.size() >= 2 && timego(D[1], D[0]) <= i)
			D.pop_front();
		maxC[i] = maxC[D.front()] + 1LL * (S[i] - S[D.front()]) * i - T;
		
		while (D.size() >= 2 && timego(D[D.size() - 1], D[D.size() - 2]) >= timego(i, D[D.size() - 1]))
			D.pop_back();
		if (timego(i, D[D.size() - 1]) != INFi)
			D.push_back(i);
	}
	
	fout << maxC[N] << '\n';
	
	fin.close();
	fout.close();
}