Cod sursa(job #1413542)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 1 aprilie 2015 22:22:42
Problema Progresii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <cstdio>
#include <cctype>

#define Nmax 100010
#define Bsize 65536

using namespace std;

int n , m , p , i;
int A[Nmax];

long long K , L , ramas , suc;

char Buffer[Bsize];

void get_number(int &x)
{
    x = 0;
    while (!isdigit(Buffer[p]))
    {
        if (p == Bsize - 1)
        {
            fread(Buffer , 1 , Bsize , stdin);
            p = 0;
        }
        else p++;
    }

    while (isdigit(Buffer[p]))
    {
        x = x * 10 + Buffer[p] - '0';
        if (p == Bsize - 1)
        {
            fread(Buffer , 1 , Bsize , stdin);
            p = 0;
        }
        else p++;
    }
}

int Binary_Search(int start , long long &x)
{
    unsigned int st = 1; unsigned int dr = m; int sol = 0;

    long long used = (L - start) / m + 1;

    if (ramas == 0)
    {
        int putere , ant = 0;
        while (true)
        {
            putere = 1;
            for (; (L - start) / (m - putere - ant) + 1 == used; putere <<= 1); if (putere > 1) putere >>= 1;
            if ((L - start) / (m - putere - ant) + 1 == used) ant += putere;
            if (putere == 1) break;
        }

        sol = m - ant;

    }

    for (unsigned int mij = (st + dr) >> 1 ; st <= dr && ramas; mij = (st + dr) >> 1)
    {
        suc = (L - start) / mij + 1;

        if (x + used >= suc) sol = mij , dr = mij - 1;
        else st = mij + 1;
    }

    if (sol > 0);
    else sol = m;

    suc = (L - start) / sol + 1;
    x += used; x -= suc;

    printf("%d\n", sol);
}

int main()
{
    freopen("progresii.in","r",stdin);
    freopen("progresii.out","w",stdout);

    scanf("%d %d %lld %lld", &n, &m, &K, &L);

    ramas = K;

    fread(Buffer , 1 , Bsize , stdin); p = 0;

    for (i = 1; i <= n; ++i)
    {
        get_number(A[i]);

        suc = (L - A[i]) / m + 1;

        ramas -= suc;

        if (ramas < 0)
        {
            printf("-1\n");
            return 0;
        }
    }

    for (i = 1; i <= n; ++i)
        Binary_Search(A[i] , ramas);

    return 0;
}