Submission #54723

#TimeUsernameProblemLanguageResultExecution timeMemory
54723luciocfRice Hub (IOI11_ricehub)C++14
100 / 100
36 ms16724 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5+10;

typedef long long ll;

ll num[MAXN], soma[MAXN], b;
int n;

bool ok(int k)
{
    if (k == 1) return true;

    ll c = soma[k]-soma[1]-(k-1)*num[1];
    int ind = 1;
    for (int i = 2; i <= k; i++)
    {
        ll aux = (i-1)*num[i]-soma[i-1]+soma[k]-soma[i]-(k-i)*num[i];
        if (aux <= c) c = aux, ind = i;
    }

    if (c <= b) return true;

    for (int i = k+1; i <= n; i++)
    {
        c -= (num[ind]-num[i-k]);
        c += (num[i]-num[ind]);

        int j = ind+1;
        ll aux = (j-(i-k+1))*num[j]-(soma[j-1]-soma[i-k]) + (soma[i]-soma[j])-(i-j)*num[j];
        if (aux <= c)
        {
            c = aux;
            ind = j;
        }

        if (c <= b) return true;
    }
    return false;
}

int busca(void)
{
    int ini = 1, fim = n;
    while (ini <= fim)
    {
        int mid = (ini+fim)>>1;

        if (mid == n && ok(mid)) return n;
        else if (mid == n)
        {
            fim = mid-1;
            continue;
        }

        if (ok(mid) && !ok(mid+1)) return mid;
        else if (ok(mid) && ok(mid+1)) ini = mid+1;
        else if (!ok(mid)) fim = mid-1;
    }
}

int besthub(int r, int l, int x[], ll k)
{
    n = r, b = k;
    for (int i = 1; i <= n; i++)
    {
        num[i] = x[i-1];
        soma[i] = soma[i-1]+num[i];
    }

    return busca();
}

Compilation message (stderr)

ricehub.cpp: In function 'int busca()':
ricehub.cpp:62:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...