This documentation is automatically generated by NotLeonian/competitive-verifier (forked from competitive-verifier/competitive-verifier)
// competitive-verifier: PROBLEM https://yukicoder.me/problems/no/275
// competitive-verifier: ERROR 0
#include <iomanip>
#include <iostream>
#include "../structure/others/dynamic-median.hpp"
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
std::cin >> n;
DynamicMedian<long long> median;
for (int i = 0; i < n; ++i) {
long long a;
std::cin >> a;
median.add(a);
}
const long double answer =
median.median<long double>(DynamicMedianMode::Average);
std::cout << std::fixed << std::setprecision(1) << answer << '\n';
return 0;
}
#line 1 "verify/yukicoder-275.test.cpp"
// competitive-verifier: PROBLEM https://yukicoder.me/problems/no/275
// competitive-verifier: ERROR 0
#include <iomanip>
#include <iostream>
#line 1 "structure/others/dynamic-median.hpp"
// 値の多重集合に対して追加、削除、中央値取得を行う。
// 中央値は下側、上側、両側の算術平均から選べる。
// T はコピー可能で、std::multiset で扱える比較を持つ型を仮定する。
// median は空でないことを仮定する。
// add, erase は O(log N)、median は O(1) である。
#include <cassert>
#include <set>
#include <type_traits>
enum class DynamicMedianMode { Lower, Upper, Average };
template <class T> struct DynamicMedian {
std::multiset<T> lower_values;
std::multiset<T> upper_values;
void add(T x) {
if (lower_values.empty() || !(*lower_values.rbegin() < x)) {
lower_values.insert(x);
} else {
upper_values.insert(x);
}
balance();
}
bool erase(T x) {
auto lower_itr = lower_values.find(x);
if (lower_itr != lower_values.end()) {
lower_values.erase(lower_itr);
balance();
return true;
}
auto upper_itr = upper_values.find(x);
if (upper_itr != upper_values.end()) {
upper_values.erase(upper_itr);
balance();
return true;
}
return false;
}
template <class Result = T>
Result median(DynamicMedianMode mode = DynamicMedianMode::Lower) const {
assert(!lower_values.empty());
const T &lower_median = *lower_values.rbegin();
if (mode == DynamicMedianMode::Lower) {
return static_cast<Result>(lower_median);
}
if (lower_values.size() != upper_values.size()) {
return static_cast<Result>(lower_median);
}
const T &upper_median = *upper_values.begin();
if (mode == DynamicMedianMode::Upper) {
return static_cast<Result>(upper_median);
}
assert(mode == DynamicMedianMode::Average);
const Result lower = static_cast<Result>(lower_median);
const Result upper = static_cast<Result>(upper_median);
if constexpr (std::is_integral_v<Result>) {
if constexpr (std::is_signed_v<Result>) {
if (lower < 0 && 0 < upper) {
return (lower + upper) / 2;
}
}
return lower / 2 + upper / 2 + (lower % 2 + upper % 2) / 2;
} else if constexpr (requires(Result lhs, Result rhs) {
(lhs + rhs) / Result(2);
}) {
return (lower + upper) / Result(2);
} else {
assert(false);
return static_cast<Result>(lower_median);
}
}
private:
void balance() {
while (lower_values.size() < upper_values.size()) {
lower_values.insert(*upper_values.begin());
upper_values.erase(upper_values.begin());
}
while (lower_values.size() > upper_values.size() + 1) {
auto itr = lower_values.end();
--itr;
upper_values.insert(*itr);
lower_values.erase(itr);
}
}
};
#line 8 "verify/yukicoder-275.test.cpp"
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
std::cin >> n;
DynamicMedian<long long> median;
for (int i = 0; i < n; ++i) {
long long a;
std::cin >> a;
median.add(a);
}
const long double answer =
median.median<long double>(DynamicMedianMode::Average);
std::cout << std::fixed << std::setprecision(1) << answer << '\n';
return 0;
}
| Env | Name | Status | Elapsed | Memory |
|---|---|---|---|---|
| g++ | 99_system_test1 |
|
3 ms | 4 MB |
| g++ | 99_system_test2 |
|
2 ms | 4 MB |
| g++ | 99_system_test3 |
|
2 ms | 4 MB |
| g++ | sample1 |
|
2 ms | 4 MB |
| g++ | sample2 |
|
2 ms | 4 MB |
| g++ | sample3 |
|
2 ms | 4 MB |
| g++ | system_test1 |
|
2 ms | 4 MB |
| g++ | system_test2 |
|
3 ms | 4 MB |
| g++ | system_test3 |
|
2 ms | 4 MB |
| g++ | system_test4 |
|
2 ms | 4 MB |
| g++ | system_test5 |
|
2 ms | 4 MB |
| g++ | test1 |
|
2 ms | 4 MB |
| g++ | test10 |
|
3 ms | 4 MB |
| g++ | test11 |
|
2 ms | 4 MB |
| g++ | test12 |
|
3 ms | 4 MB |
| g++ | test13 |
|
2 ms | 4 MB |
| g++ | test14 |
|
2 ms | 4 MB |
| g++ | test15 |
|
3 ms | 4 MB |
| g++ | test16 |
|
3 ms | 4 MB |
| g++ | test17 |
|
3 ms | 4 MB |
| g++ | test18 |
|
2 ms | 4 MB |
| g++ | test19 |
|
2 ms | 4 MB |
| g++ | test2 |
|
2 ms | 4 MB |
| g++ | test20 |
|
2 ms | 4 MB |
| g++ | test21 |
|
3 ms | 4 MB |
| g++ | test22 |
|
2 ms | 4 MB |
| g++ | test23 |
|
3 ms | 4 MB |
| g++ | test24 |
|
2 ms | 4 MB |
| g++ | test25 |
|
3 ms | 4 MB |
| g++ | test26 |
|
2 ms | 4 MB |
| g++ | test27 |
|
2 ms | 4 MB |
| g++ | test28 |
|
2 ms | 4 MB |
| g++ | test29 |
|
2 ms | 4 MB |
| g++ | test3 |
|
2 ms | 4 MB |
| g++ | test30 |
|
3 ms | 4 MB |
| g++ | test4 |
|
2 ms | 4 MB |
| g++ | test5 |
|
3 ms | 4 MB |
| g++ | test6 |
|
3 ms | 4 MB |
| g++ | test7 |
|
3 ms | 4 MB |
| g++ | test8 |
|
2 ms | 4 MB |
| g++ | test9 |
|
3 ms | 4 MB |
| clang++ | 99_system_test1 |
|
3 ms | 4 MB |
| clang++ | 99_system_test2 |
|
2 ms | 4 MB |
| clang++ | 99_system_test3 |
|
2 ms | 4 MB |
| clang++ | sample1 |
|
2 ms | 4 MB |
| clang++ | sample2 |
|
2 ms | 4 MB |
| clang++ | sample3 |
|
2 ms | 4 MB |
| clang++ | system_test1 |
|
2 ms | 4 MB |
| clang++ | system_test2 |
|
2 ms | 4 MB |
| clang++ | system_test3 |
|
2 ms | 4 MB |
| clang++ | system_test4 |
|
2 ms | 4 MB |
| clang++ | system_test5 |
|
2 ms | 4 MB |
| clang++ | test1 |
|
2 ms | 4 MB |
| clang++ | test10 |
|
3 ms | 4 MB |
| clang++ | test11 |
|
2 ms | 4 MB |
| clang++ | test12 |
|
3 ms | 4 MB |
| clang++ | test13 |
|
2 ms | 4 MB |
| clang++ | test14 |
|
2 ms | 4 MB |
| clang++ | test15 |
|
3 ms | 4 MB |
| clang++ | test16 |
|
3 ms | 4 MB |
| clang++ | test17 |
|
3 ms | 4 MB |
| clang++ | test18 |
|
2 ms | 4 MB |
| clang++ | test19 |
|
2 ms | 4 MB |
| clang++ | test2 |
|
2 ms | 4 MB |
| clang++ | test20 |
|
2 ms | 4 MB |
| clang++ | test21 |
|
3 ms | 4 MB |
| clang++ | test22 |
|
2 ms | 4 MB |
| clang++ | test23 |
|
3 ms | 4 MB |
| clang++ | test24 |
|
2 ms | 4 MB |
| clang++ | test25 |
|
3 ms | 4 MB |
| clang++ | test26 |
|
2 ms | 4 MB |
| clang++ | test27 |
|
2 ms | 4 MB |
| clang++ | test28 |
|
2 ms | 4 MB |
| clang++ | test29 |
|
2 ms | 4 MB |
| clang++ | test3 |
|
2 ms | 4 MB |
| clang++ | test30 |
|
3 ms | 4 MB |
| clang++ | test4 |
|
2 ms | 4 MB |
| clang++ | test5 |
|
3 ms | 4 MB |
| clang++ | test6 |
|
3 ms | 4 MB |
| clang++ | test7 |
|
3 ms | 4 MB |
| clang++ | test8 |
|
2 ms | 4 MB |
| clang++ | test9 |
|
3 ms | 4 MB |