This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include "ricehub.h"
using namespace std;
int median = -1;
multiset<int> low, big;
int64_t sum_low, sum_big;
void fix() {
int m = (low.size() + big.size()) >> 1;
if ((int)low.size() < m) {
low.emplace(median);
sum_low += median;
median = *big.begin();
big.erase(big.begin());
sum_big -= median;
}
if ((int)low.size() > m) {
big.emplace(median);
sum_big += median;
median = *--low.end();
low.erase(--low.end());
sum_low -= median;
}
}
void add(int x) {
if (median == -1) {
median = x;
return;
}
if (x < median) {
low.emplace(x);
sum_low += x;
} else {
big.emplace(x);
sum_big += x;
}
fix();
}
void rem(int x) {
if (x == median) {
median = *big.begin();
big.erase(big.begin());
sum_big -= median;
} else {
if (x < median) {
low.erase(low.find(x));
sum_low -= x;
} else {
big.erase(big.find(x));
sum_big -= x;
}
}
fix();
}
int64_t cost() {
return (int64_t)low.size() * median - sum_low + sum_big - (int64_t)big.size() * median;
}
void maxSelf(int &x, int y) {
if (x < y) {
x = y;
}
}
int besthub(int R, int L, int X[], long long B) {
int ans = 1, l = 0;
for (int r = 0; r < R; ++r) {
add(X[r]);
while (B < cost()) {
rem(X[l]);
l += 1;
}
maxSelf(ans, r - l + 1);
}
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |