Submission #348693

#TimeUsernameProblemLanguageResultExecution timeMemory
348693idk321Rice Hub (IOI11_ricehub)C++11
100 / 100
22 ms1132 KiB
    #include "ricehub.h"

    #include <bits/stdc++.h>

    using namespace std;

    typedef long long ll;

    const int N = 100005;
    int pos[N];

    int n;
    long long money;

    bool poss(int len)
    {
        ll cost = 0;
        int a = 0;
        int b = len - 1;
        int mid = (a + b) / 2;
        int left = 0;
        int right = 0;
        for (int i = a; i <= b; i++)
        {
            cost += abs(pos[i] - pos[mid]);
        }
        left = mid - a;
        right = b - mid;
        //cout << len << " " << cost << " " << money << endl;
        if (cost <= money) return true;
        while (b + 1 < n)
        {
            cost -= pos[mid] - pos[a];
            cost += ((ll)left) * (pos[mid + 1] - pos[mid]);
            cost -= ((ll)right) * (pos[mid + 1] - pos[mid]);
            mid++;
            a++;
            b++;
            cost += pos[b] - pos[mid];
            if (cost <= money) return true;
        }

        return false;
    }

    int binarySearch()
    {
        int a = 1;
        int b = n;
        int res = -1;
        while (a <= b)
        {
            int mid = (a + b) / 2;
            if (poss(mid))
            {
                res = mid;
                a = mid + 1;
            } else
            {
                b = mid - 1;
            }
        }

        return res;
    }

    int besthub(int n1, int l, int x[], long long money1)
    {
        money = money1;
        n = n1;
        for (int i = 0; i < n; i++)
        {
            pos[i] = x[i];
        }

      return binarySearch();
    }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...