100
#LS1039. 【入门】多个priority_queue

【入门】多个priority_queue

题目描述

给你 nn 个数组,分别是 ai(i=0,1,2...,n1)a_i(i=0,1,2...,n-1),初始都为空,现在有如下 3 中操作

  • 0 t x, 表示将 xx 添加到 ata_t
  • 1 t,表示如果 ata_t 不为空,则输出 ata_t 中的最大的元素;否则什么也不做
  • 2 t,表示如果 ata_t 不为空,则删除 ata_t 中的最大的元素;否则什么也不做

注意:

  • priority_queue 默认把 最大的元素 放在 top()
  • 如果我们想让 top() 返回最小的元素,可以 在插入元素的时候加个负号

输入格式

第 1 行包含 2 个整数正 n(1n1000),q(1q5105)n(1 \le n \le 1000), q(1 \le q \le 5*10^5),表示数组的个数和操作的个数

接下来 qq 行,每行的第 1 个数是操作的类型 cc

  • c=0c = 0 时,再输入 2 个数 txt 和 x,表示将 xx 添加到 ata_t
  • c=1c = 1 时,再输入 1 个数 tt,表示如果 ata_t 不为空,则输出 ata_t 中的最大的元素;否则什么也不做
  • c=2c = 2 时,再输入 1 个数 tt,表示如果 ata_t 不为空,则删除 ata_t 中的最大的元素;否则什么也不做

输出格式

  • 每当 c=1c = 1 时,如果 ata_t 不为空,输出 a[t]a[t] 中最大的数
2 10
0 0 3
0 0 9
0 0 1
1 0
2 0
1 0
0 0 4
1 0
0 1 8
1 1
9
3
4
8

提示

// 申明 n 个 priority_queue
vector<priority_queue<int>> a(n);
for (int i = 0; i < q; i++) {
    cin >> t >> x;
    // 使用 push() 将 x 添加到 a[t]
    a[t].push(x);
}

// 使用 empty() 判断 a[t] 是否为空
if (!a[t].empty()) {
    // 使用 top() 获取最大值
    cout << a[t].top() << '\n';
}

// 使用 empty() 判断 a[t] 是否为空
if (!a[t].empty()) {
    // 使用 pop() 删除最大值
    a[t].pop();
}

数据规模与限制

  • 1n1000,1q51051 \le n \le 1000, 1 \le q \le 5*10^5
  • 1s, 1024KiB for each test case.