Cod sursa(job #1760836)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 21 septembrie 2016 12:38:55
Problema Shop Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <algorithm>

using namespace std;

struct mon{
    int ap, sol, i;
    long long val;
}v[35];

long long lgpow(long long b, long long e){
    long long sol = 1;
    while(e){
        if(e&1){
            sol *= b;
        }
        b *= b;
        e >>= 1;
    }
    return sol;
}

int binarySearch(long long s, long long id, long long L){
    long long step;
    long long n = v[id].ap;
    long long i;
    for(step = 1;step <= n;step <<= 1);
    for(i = s - 1;step;step >>= 1){
        if(i + step <= n && (i + step) * v[id].val <= L){
            i += step;
        }
    }
    return i;
}

bool comp(mon m1, mon m2){
    return m1.val < m2.val;
}


bool comp2(mon m1, mon m2){
    return m1.i < m2.i;
}

int main()
{
    freopen("shop.in", "r", stdin);
    freopen("shop.out", "w", stdout);
    long long N,C,L,i,x,y;
    scanf("%lld %lld %lld", &N, &C, &L);
    for(i = 1;i <= N;i++){
        scanf("%lld %lld", &x, &v[i].ap);
        v[i].val = lgpow(C, x);
        v[i].i = i;
    }
    sort(v+1, v+N+1, comp);
    long long uses,ans;
    ans = 0;
    for(i = N;L;i--){
        if(v[i].val > L){
            continue;
        }
        uses = binarySearch(1, i, L);
        L -= uses*v[i].val;
        v[i].sol += uses;
        ans += v[i].sol;
    }
    printf("%lld\n", ans);
    sort(v+1, v+N+1, comp2);
    for(i = 1;i <= N;i++){
        printf("%d ", v[i].sol);
    }
    return 0;
}