NicheLibrary

This documentation is automatically generated by NotLeonian/competitive-verifier (forked from competitive-verifier/competitive-verifier)

View the Project on GitHub NotLeonian/NicheLibrary

:heavy_check_mark: verify/yukicoder-275.test.cpp

Depends on

Code

// 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;
}

Test cases

Env Name Status Elapsed Memory
g++ 99_system_test1 :heavy_check_mark: AC 3 ms 4 MB
g++ 99_system_test2 :heavy_check_mark: AC 2 ms 4 MB
g++ 99_system_test3 :heavy_check_mark: AC 2 ms 4 MB
g++ sample1 :heavy_check_mark: AC 2 ms 4 MB
g++ sample2 :heavy_check_mark: AC 2 ms 4 MB
g++ sample3 :heavy_check_mark: AC 2 ms 4 MB
g++ system_test1 :heavy_check_mark: AC 2 ms 4 MB
g++ system_test2 :heavy_check_mark: AC 3 ms 4 MB
g++ system_test3 :heavy_check_mark: AC 2 ms 4 MB
g++ system_test4 :heavy_check_mark: AC 2 ms 4 MB
g++ system_test5 :heavy_check_mark: AC 2 ms 4 MB
g++ test1 :heavy_check_mark: AC 2 ms 4 MB
g++ test10 :heavy_check_mark: AC 3 ms 4 MB
g++ test11 :heavy_check_mark: AC 2 ms 4 MB
g++ test12 :heavy_check_mark: AC 3 ms 4 MB
g++ test13 :heavy_check_mark: AC 2 ms 4 MB
g++ test14 :heavy_check_mark: AC 2 ms 4 MB
g++ test15 :heavy_check_mark: AC 3 ms 4 MB
g++ test16 :heavy_check_mark: AC 3 ms 4 MB
g++ test17 :heavy_check_mark: AC 3 ms 4 MB
g++ test18 :heavy_check_mark: AC 2 ms 4 MB
g++ test19 :heavy_check_mark: AC 2 ms 4 MB
g++ test2 :heavy_check_mark: AC 2 ms 4 MB
g++ test20 :heavy_check_mark: AC 2 ms 4 MB
g++ test21 :heavy_check_mark: AC 3 ms 4 MB
g++ test22 :heavy_check_mark: AC 2 ms 4 MB
g++ test23 :heavy_check_mark: AC 3 ms 4 MB
g++ test24 :heavy_check_mark: AC 2 ms 4 MB
g++ test25 :heavy_check_mark: AC 3 ms 4 MB
g++ test26 :heavy_check_mark: AC 2 ms 4 MB
g++ test27 :heavy_check_mark: AC 2 ms 4 MB
g++ test28 :heavy_check_mark: AC 2 ms 4 MB
g++ test29 :heavy_check_mark: AC 2 ms 4 MB
g++ test3 :heavy_check_mark: AC 2 ms 4 MB
g++ test30 :heavy_check_mark: AC 3 ms 4 MB
g++ test4 :heavy_check_mark: AC 2 ms 4 MB
g++ test5 :heavy_check_mark: AC 3 ms 4 MB
g++ test6 :heavy_check_mark: AC 3 ms 4 MB
g++ test7 :heavy_check_mark: AC 3 ms 4 MB
g++ test8 :heavy_check_mark: AC 2 ms 4 MB
g++ test9 :heavy_check_mark: AC 3 ms 4 MB
clang++ 99_system_test1 :heavy_check_mark: AC 3 ms 4 MB
clang++ 99_system_test2 :heavy_check_mark: AC 2 ms 4 MB
clang++ 99_system_test3 :heavy_check_mark: AC 2 ms 4 MB
clang++ sample1 :heavy_check_mark: AC 2 ms 4 MB
clang++ sample2 :heavy_check_mark: AC 2 ms 4 MB
clang++ sample3 :heavy_check_mark: AC 2 ms 4 MB
clang++ system_test1 :heavy_check_mark: AC 2 ms 4 MB
clang++ system_test2 :heavy_check_mark: AC 2 ms 4 MB
clang++ system_test3 :heavy_check_mark: AC 2 ms 4 MB
clang++ system_test4 :heavy_check_mark: AC 2 ms 4 MB
clang++ system_test5 :heavy_check_mark: AC 2 ms 4 MB
clang++ test1 :heavy_check_mark: AC 2 ms 4 MB
clang++ test10 :heavy_check_mark: AC 3 ms 4 MB
clang++ test11 :heavy_check_mark: AC 2 ms 4 MB
clang++ test12 :heavy_check_mark: AC 3 ms 4 MB
clang++ test13 :heavy_check_mark: AC 2 ms 4 MB
clang++ test14 :heavy_check_mark: AC 2 ms 4 MB
clang++ test15 :heavy_check_mark: AC 3 ms 4 MB
clang++ test16 :heavy_check_mark: AC 3 ms 4 MB
clang++ test17 :heavy_check_mark: AC 3 ms 4 MB
clang++ test18 :heavy_check_mark: AC 2 ms 4 MB
clang++ test19 :heavy_check_mark: AC 2 ms 4 MB
clang++ test2 :heavy_check_mark: AC 2 ms 4 MB
clang++ test20 :heavy_check_mark: AC 2 ms 4 MB
clang++ test21 :heavy_check_mark: AC 3 ms 4 MB
clang++ test22 :heavy_check_mark: AC 2 ms 4 MB
clang++ test23 :heavy_check_mark: AC 3 ms 4 MB
clang++ test24 :heavy_check_mark: AC 2 ms 4 MB
clang++ test25 :heavy_check_mark: AC 3 ms 4 MB
clang++ test26 :heavy_check_mark: AC 2 ms 4 MB
clang++ test27 :heavy_check_mark: AC 2 ms 4 MB
clang++ test28 :heavy_check_mark: AC 2 ms 4 MB
clang++ test29 :heavy_check_mark: AC 2 ms 4 MB
clang++ test3 :heavy_check_mark: AC 2 ms 4 MB
clang++ test30 :heavy_check_mark: AC 3 ms 4 MB
clang++ test4 :heavy_check_mark: AC 2 ms 4 MB
clang++ test5 :heavy_check_mark: AC 3 ms 4 MB
clang++ test6 :heavy_check_mark: AC 3 ms 4 MB
clang++ test7 :heavy_check_mark: AC 3 ms 4 MB
clang++ test8 :heavy_check_mark: AC 2 ms 4 MB
clang++ test9 :heavy_check_mark: AC 3 ms 4 MB
Back to top page