Nyaan's Library

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

View on GitHub

:heavy_check_mark: data-structure/erasable-priority-queue.hpp

Verified with

Code

#pragma once

#include <queue>
#include <type_traits>
using namespace std;

template <typename T, bool Minimize = true>
struct ErasablePriorityQueue {
  using Queue =
      conditional_t<Minimize, priority_queue<T, vector<T>, greater<T>>,
                    priority_queue<T>>;
  Queue Q, Q2;

  ErasablePriorityQueue() = default;

  void push(const T& t) { Q.push(t); }
  T top() {
    normalize();
    assert(!Q.empty());
    return Q.top();
  }
  void pop() {
    normalize();
    assert(!Q.empty());
    Q.pop();
  }
  void erase(const T& t) { Q2.push(t); }

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

#include <queue>
#include <type_traits>
using namespace std;

template <typename T, bool Minimize = true>
struct ErasablePriorityQueue {
  using Queue =
      conditional_t<Minimize, priority_queue<T, vector<T>, greater<T>>,
                    priority_queue<T>>;
  Queue Q, Q2;

  ErasablePriorityQueue() = default;

  void push(const T& t) { Q.push(t); }
  T top() {
    normalize();
    assert(!Q.empty());
    return Q.top();
  }
  void pop() {
    normalize();
    assert(!Q.empty());
    Q.pop();
  }
  void erase(const T& t) { Q2.push(t); }

 private:
  void normalize() {
    while (!Q.empty() and !Q2.empty() and Q.top() == Q2.top()) {
      Q.pop(), Q2.pop();
    }
  }
};
Back to top page