[学习笔记] pd_ds黑科技

https://www.cnblogs.com/jiqimin/p/11226809.html

丢个链接,跑路

// Author: wlzhouzhuan
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#include <ext/pb_ds/priority_queue.hpp>
using namespace std;
using namespace __gnu_pbds;

#define ll long long
#define ull unsigned long long
#define rint register int
#define rep(i, l, r) for (rint i = l; i <= r; i++)
#define per(i, l, r) for (rint i = l; i >= r; i--)
#define mset(s, _) memset(s, _, sizeof(s))
#define pb push_back
#define pii pair <int, int>
#define mp(a, b) make_pair(a, b)

inline int read() {
  int x = 0, neg = 1; char op = getchar();
  while (!isdigit(op)) { if (op == '-') neg = -1; op = getchar(); }
  while (isdigit(op)) { x = 10 * x + op - '0'; op = getchar(); }
  return neg * x;
}
inline void print(int x) {
  if (x < 0) { putchar('-'); x = -x; }
  if (x >= 10) print(x / 10);
  putchar(x % 10 + '0');
}

const int N = 105;
#define it_min __gnu_pbds::priority_queue <pii, greater <pii>, pairing_heap_tag>::point_const_iterator
#define it_max __gnu_pbds::priority_queue <pii, less <pii>, pairing_heap_tag>::point_const_iterator
__gnu_pbds::priority_queue <pii, greater <pii>, pairing_heap_tag> pq_min[N];
__gnu_pbds::priority_queue <pii, less <pii>, pairing_heap_tag> pq_max[N];
unordered_map <int, it_min> fa;
unordered_map <int, it_max> fb;
int n, m;

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for (rint i = 1; i <= m; i++) {
    int opt;
    cin >> opt;
    if (opt == 1) {
      int x, y;
      cin >> x >> y;
      it_min v1 = pq_min[x].push({y, i}); fa[i] = v1;
      it_max v2 = pq_max[x].push({y, i}); fb[i] = v2;
    } else if (opt == 2) {
      int x;
      cin >> x;
      if (pq_min[x].empty()) cout << "-1\n";
      else {
        pii ans = pq_min[x].top(); 
        cout << ans.first << '\n';
        pq_min[x].pop();
        pq_max[x].erase(fb[ans.second]);
      }
    } else if (opt == 3) {
      int x;
      cin >> x;
      if (pq_max[x].empty()) cout << "-1\n";
      else {
        pii ans = pq_max[x].top();
        cout << ans.first << '\n';
        pq_max[x].pop();
        pq_min[x].erase(fa[ans.second]);
      }
    } else {
      int x, y;
      cin >> x >> y;
      pq_min[y].join(pq_min[x]);
      pq_max[y].join(pq_max[x]);
    }
  }  
  return 0;
}
posted @ 2020-04-28 20:26  wlzhouzhuan  阅读(398)  评论(0编辑  收藏  举报