NC214362 第k小
题目
题目描述
有一个长度为n的数组,值为 a[i], 牛牛想找到数组中第 k 小的数。比如 1 2 2 3 4 6 中,第 3 小的数就是2.
牛牛觉得这个游戏太简单了,想加一点难度,现在牛牛有 m 个操作,每个操作有两种类型。
1 x 1 代表操作一,给数组中加一个元素 x 。(0 ≤ x ≤ 1e9)
2 2 代表操作二,查询第 k 小的数。如果没有 k 个数就输出−1
输入描述
第一行有三个整数,n m k,(1≤n,m,k≤2e5)
第二行包含 n 个整数 a[i] ( 0 ≤ a[i] ≤ 1e9)
接下来m行,每行代表一个操作。具体见题目描述
输出描述
每次查询输出一个第 k 小的数。
示例1
输入
5 4 3 1 2 3 4 5 2 1 1 1 3 2
输出
3 2
题解
知识点:优先队列。
这和输出一个固定序列的第 小不同,这里要维护一个动态变化的序列,故用小顶堆维护前 个数,那么队头就是第 个数。
要注意有可能不足 个数。
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> using namespace std; int main() { std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int n, m, k; cin >> n >> m >> k; priority_queue<int> pq; for (int i = 0, tmp;i < n;i++) { cin >> tmp; pq.push(tmp); if (pq.size() > k) pq.pop(); } while (m--) { int op; cin >> op; if (op == 1) { int tmp; cin >> tmp; pq.push(tmp); if (pq.size() > k) pq.pop(); } else if (op == 2) { cout << (pq.size() == k ? pq.top() : -1) << '\n'; } } return 0; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/16459954.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧