Submission #751141

#TimeUsernameProblemLanguageResultExecution timeMemory
751141tranxuanbachRice Hub (IOI11_ricehub)C++17
100 / 100
59 ms5968 KiB
#include "ricehub.h"

#include <bits/stdc++.h>
using namespace std;

#define endl '\n'
#define fi first
#define se second
#define For(i, l, r) for (auto i = (l); i < (r); i++)
#define ForE(i, l, r) for (auto i = (l); i <= (r); i++)
#define FordE(i, l, r) for (auto i = (l); i >= (r); i--)
#define Fora(v, a) for (auto v: (a))
#define bend(a) (a).begin(), (a).end()
#define isz(a) ((signed)(a).size())

using ll = long long;
using ld = long double;
using pii = pair <int, int>;
using vi = vector <int>;
using vpii = vector <pii>;
using vvi = vector <vi>;

const int N = 1e5 + 5;

int n;
int a[N];

multiset <int> mtslo, mtshi;
ll sumlo, sumhi;

int median(){
    return mtslo.empty() ? INT_MAX : *mtslo.rbegin();
}

ll cal_dist(){
    int m = median();
    return sumhi - (ll)m * isz(mtshi) + (ll)m * isz(mtslo) - sumlo;
}

void balance(){
    while (isz(mtslo) > isz(mtshi) + 1){
        int x = *mtslo.rbegin();
        mtslo.erase(mtslo.find(x));
        sumlo -= x;
        mtshi.insert(x);
        sumhi += x;
    }
    while (isz(mtslo) < isz(mtshi)){
        int x = *mtshi.begin();
        mtshi.erase(mtshi.find(x));
        sumhi -= x;
        mtslo.insert(x);
        sumlo += x;
    }
}

void insert(int x){
    if (x <= median()){
        mtslo.insert(x);
        sumlo += x;
    }
    else{
        mtshi.insert(x);
        sumhi += x;
    }
    balance();
}

void erase(int x){
    if (mtslo.find(x) != mtslo.end()){
        mtslo.erase(mtslo.find(x));
        sumlo -= x;
    }
    else{
        mtshi.erase(mtshi.find(x));
        sumhi -= x;
    }
    balance();
}

int besthub(int _n, int l, int _a[], ll val){
    n = _n;
    For(i, 0, n){
        a[i] = _a[i];
    }

    int ans = 0;
    int r = -1;
    For(l, 0, n){
        while (r + 1 < n){
            r++;
            insert(a[r]);
            if (cal_dist() > val){
                erase(a[r]);
                r--;
                break;
            }
        }
        ans = max(ans, r - l + 1);
        erase(a[l]);
    }
    return ans;
}

/*
==================================================+
INPUT                                             |
--------------------------------------------------|

--------------------------------------------------|
==================================================+
OUTPUT                                            |
--------------------------------------------------|

--------------------------------------------------|
==================================================+
*/

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...