Cod sursa(job #335249)

Utilizator CezarMocanCezar Mocan CezarMocan Data 29 iulie 2009 11:36:37
Problema Progresii Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <cstdio>
#define maxn 100100

using namespace std;

long long n, i, j, m, k, l, sol;
long long v[maxn], x[maxn];

bool bun(long long sp, long long nrmax) {
	if ((l - v[i]) / sp + 1 <= nrmax)
		return true;
	return false;
}

long long bsearch(long long l, long long r, long long nrmax) {
	long long m, rez = 2000000000;
	while (l <= r) {
		m = (l + r) / 2;
		if (bun(m, nrmax)) {
			if (m < rez)
				rez = m;
			r = m - 1;
		}
		else
			l = m + 1;
	}
	return rez;
}

int main() {
	freopen("progresii.in", "r", stdin);
	freopen("progresii.out", "w", stdout);
	
	//x[i] = costu minim pe care il pot obtine de la i incolo
	scanf("%lld%lld%lld%lld", &n, &m, &k, &l);
	for (i = 1; i <= n; i++)
		scanf("%lld", &v[i]);
	
	for (i = n; i >= 1; i--) 
		x[i] = x[i + 1] + (l - v[i]) / m + 1;
	
	for (i = 1; i <= n; i++) {
		sol = bsearch(1, m, k - x[i + 1]);
		k -= (l - v[i]) / sol + 1;
		printf("%d\n", sol);
	}
	
	return 0;
}