Cod sursa(job #163576)

Utilizator tvladTataranu Vlad tvlad Data 22 martie 2008 14:47:30
Problema Progresii Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasa a 9-a Marime 1.12 kb
#include <cstdio>

const int N = 100000;

int n,m,k,len,tot;
int d[N];
int r[N];

inline int min ( int a, int b ) { return (a < b) ? a : b; }

int main() {
	freopen("progresii.in","rt",stdin);
	freopen("progresii.out","wt",stdout);
	scanf("%d %d %d %d",&n,&m,&k,&len);
	tot = 0;
	for (int i = 0,p; i < n; ++i) {
		scanf("%d",&p);
		d[i] = len-p+1;
		tot += d[i];
	}
	for (int i = n-1; i >= 0; --i) {
		r[i] = 1;
		int rem = tot - d[i], left, right;
		for (left = 0, right = min(m-1,d[i]-1); right - left > 1; ) {
			// In the middle of the night
			// I go walking in my sleep
			int mid = (left+right)/2;
			// And i'm searching for something
			if (rem + (1 + (d[i] - 1) / mid) > k) {
				left = mid;
			} else {
				right = mid;
			}
		}
		if (rem + (1 + (d[i] - 1) / (left + 1)) <= k)
			r[i] = left+1; else
			r[i] = right+1;
		tot -= d[i];
		tot += (1 + (d[i] - 1) / r[i]);
	}
	if (tot > k) {
		printf("-1\n");
		return 0;
	}
	// Basarabie frumoasa
	// Pregateste-te mireasa
	// Ca-ti aducem petitor
	// Sfantul nostru tricolor
	for (int i = 0; i < n; ++i) printf("%d\n",r[i]);
	return 0;
}