compro_library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub siro53/compro_library

:heavy_check_mark: 削除可能 priority queue
(data-structure/erasable-priority-queue.hpp)

priority_queue を 2 つ持ち、片方に削除待ちの要素を入れて削除を遅延評価することで実質的に削除も出来るようにした priority_queue。

queue に存在しない要素を削除しようとするとバグるので注意

Verified with

Code

#pragma once

#include <cassert>
#include <functional>
#include <type_traits>
#include <queue>
#include <vector>

template<class T, bool isAscending = true>
struct ErasablePriorityQueue {
    using PQ = std::conditional_t<
        isAscending,
        std::priority_queue<T, std::vector<T>, std::greater<T>>,
        std::priority_queue<T>
    >;
    PQ que, rm_que;

    ErasablePriorityQueue() = default;

    void push(const T& val) {
        que.emplace(val);
    }

    T top() {
        normalize();
        assert(!que.empty());
        return que.top();
    }

    void pop() {
        normalize();
        assert(!que.empty());
        que.pop();
    }

    void erase(const T& val) {
        rm_que.emplace(val);
    }

    bool empty() {
        return que.empty();
    }
private:
    void normalize() {
        while(!que.empty() and !rm_que.empty() and que.top() == rm_que.top()) {
            que.pop();
            rm_que.pop();
        }
    }
};
#line 2 "data-structure/erasable-priority-queue.hpp"

#include <cassert>
#include <functional>
#include <type_traits>
#include <queue>
#include <vector>

template<class T, bool isAscending = true>
struct ErasablePriorityQueue {
    using PQ = std::conditional_t<
        isAscending,
        std::priority_queue<T, std::vector<T>, std::greater<T>>,
        std::priority_queue<T>
    >;
    PQ que, rm_que;

    ErasablePriorityQueue() = default;

    void push(const T& val) {
        que.emplace(val);
    }

    T top() {
        normalize();
        assert(!que.empty());
        return que.top();
    }

    void pop() {
        normalize();
        assert(!que.empty());
        que.pop();
    }

    void erase(const T& val) {
        rm_que.emplace(val);
    }

    bool empty() {
        return que.empty();
    }
private:
    void normalize() {
        while(!que.empty() and !rm_que.empty() and que.top() == rm_que.top()) {
            que.pop();
            rm_que.pop();
        }
    }
};
Back to top page