제출 #500565

#제출 시각아이디문제언어결과실행 시간메모리
500565beaconmcRice Hub (IOI11_ricehub)C++17
100 / 100
113 ms7984 KiB
#include "ricehub.h"
#include <bits/stdc++.h>


typedef long long ll;
#define FOR(i, x, y) for(ll i=x; i<y; i++)

using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
  
#define ordered_set tree<ll, null_type,less_equal<ll>, rb_tree_tag,tree_order_statistics_node_update>

ordered_set sustree;
ll  median, newmed;
ll rsum,lsum;

ll insert(ll a){
    if (sustree.size() == 0) median = a;
    else median = *sustree.find_by_order((sustree.size()-1)/2);

    if (a <= median && sustree.size()%2==1) lsum += a,lsum -= median, rsum += median;
    else if (a<=median) lsum += a;

    else{
        sustree.insert(a);
        median = *sustree.find_by_order((sustree.size()-1)/2);
        if (sustree.size()%2 == 0) rsum += a;
        else lsum += median, rsum -= median, rsum += a;
        goto lol;
    }
    sustree.insert(a);
    lol:
    median = *sustree.find_by_order((sustree.size()-1)/2);
    if (sustree.size() %2 == 1) return rsum - lsum + median;
    else return rsum - lsum;
}


ll remove(ll a){
    median = *sustree.find_by_order((sustree.size()-1)/2);
    if (sustree.size()%2==1){
        if (a<=median) lsum -= a;
        else lsum -= median, rsum -= a, rsum += median;
    } 
    else{
        sustree.erase(sustree.find_by_order(sustree.order_of_key(a)));
        median = *sustree.find_by_order((sustree.size()-1)/2);
        if (a<=median) lsum -= a, lsum += median, rsum -= median;
        else rsum -= a;
        goto lmao;
    }
    sustree.erase(sustree.find_by_order(sustree.order_of_key(a)));
    lmao:
    median = *sustree.find_by_order((sustree.size()-1)/2);
    if (sustree.size() %2 == 1) return rsum - lsum + median;
    else return rsum - lsum;
}


int besthub(int R, int L, int X[], ll B){
    ll maxi = 0;
    ll lo = 0;
    ll hi = 0;
    while (lo<=hi && hi<R){
        if (insert(X[hi]) <= B){
            hi++;
        }else{
            remove(X[hi]);
            remove(X[lo]);
            lo++;
        }
        maxi = max(maxi, hi-lo);
    }
    return maxi;
}
/*int main(){
    int R,L,B;
    cin >> R >> L >> B;
    int X[R];
    FOR(i, 0, R){
        cin >> X[i];
    }
    cout << besthub(R, L, X, B);
}*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...