Cod sursa(job #2291284)

Utilizator mihailescu_eduardMihailescu Eduard-Florin mihailescu_eduard Data 27 noiembrie 2018 20:42:42
Problema Grupuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <cstdio>
#include <algorithm>
using namespace std;
 
#define lli long long int

FILE *fin = freopen("grupuri.in", "r",stdin);
FILE *fout = freopen("grupuri.out","w",stdout);
 
static const int NMAX = 1e5+5;
 
lli n,k;
lli v[NMAX];
lli pref[NMAX];
lli sumTotal;
lli logN, pas;
lli log;

lli cb(lli x)
{
    lli p = 0;
    for(lli salt = log;salt ; salt>>=1)
    {
        if(salt+p <= n)
        {
            if(v[salt+p] <= x){
                p+=salt;
            }
        } 
    }
    return p;
}

bool Check(lli m)
{
    lli s = 0;
    lli poz  = cb(m);
    //printf("m %lld  poz %lld ", m, poz);
    s+=pref[poz];
    //printf("s min %lld ", s);
    s+=(n-poz) * m;
    //printf("n-poz %lld\n",n-poz);

    if(s >= m * k)
        return true;
    return false;
}

int main()
{
    scanf("%lld%lld",&k,&n);
    for(log=1; log<=n ; log<<=1);
    
    for(int i= 1; i<= n; ++i)
    {
        scanf("%lld",&v[i]);
        sumTotal+=v[i];
        pref[i] = pref[i-1] + v[i];
    }
    for(logN = 1; logN <= sumTotal/k+1; logN<<=1);

    
    for(;logN; logN >>=1)
    {
        if((pas + logN)*k <= sumTotal && Check((pas+logN)))
            pas+=logN;
    }
 
    printf("%lld", pas);
    return 0;
}