Pagini recente » Cod sursa (job #12531) | Cod sursa (job #1462183) | Cod sursa (job #1882277) | Cod sursa (job #2402266) | Cod sursa (job #162087)
Cod sursa(job #162087)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <time.h>
using namespace std;
#define llong long long
#define MAXN 100100
int N, M, A[MAXN], R[MAXN]; llong K, X, T[MAXN];
void solve(void)
{
int i, j, k, st, dr, r, m; llong sum = 0, p = 0;
int start = clock(), end;
for(i = N; i >= 1; i--)
{
T[i] = T[i+1] + (X >= A[i] ? (X-A[i])/M+1 : 0);
if(T[i] > K) printf("-1\n"), exit(0);
}
for(i = 1; i <= N; i++)
{
st = 1, dr = M;
while(st <= dr)
{
m = ((unsigned)st+dr) >> 1;
if( sum + T[i+1] + (X >= A[i] ? (X-A[i])/m+1:0) <= K )
r = m, dr = m-1;
else
st = m+1;
}
R[i] = r, sum = sum + (X >= A[i] ? (X-A[i]) / r + 1 : 0);
p = p + min( (llong)r, (llong)M-r );
}
end = clock();
fprintf(stderr, "%lld\n", p);
fprintf(stderr, "%lf\n", (double)(end-start)/CLOCKS_PER_SEC);
}
void read_data(void)
{
int i;
scanf("%d %d %lld %lld\n", &N, &M, &K, &X);
for(i = 1; i <= N; i++) scanf("%d ", &A[i]);
}
void write_data(void)
{
int i;
for(i = 1; i <= N; i++) printf("%d\n", R[i]);
}
int main(void)
{
freopen("progresii.in", "rt", stdin);
freopen("progresii.out", "wt", stdout);
read_data();
solve();
write_data();
return 0;
}