[HDOJ4006]The kth great number
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4006
提供插入查询两个操作,问这些数中第k大的数字是几。
可以用最小堆完成这个任务,把k看作是堆的容量,堆顶就是第k大的数。这样只需要保留前k大的数输出最小那个就可以了。
1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <fstream> 8 #include <cassert> 9 #include <cstdio> 10 #include <bitset> 11 #include <vector> 12 #include <deque> 13 #include <queue> 14 #include <stack> 15 #include <ctime> 16 #include <set> 17 #include <map> 18 #include <cmath> 19 20 using namespace std; 21 22 const int maxn = 100010; 23 const int INF = 2147483647; 24 int heap[maxn]; 25 int pos; 26 27 void init() { 28 pos = 0; 29 memset(heap, 0, sizeof(heap)); 30 heap[0] = -INF; 31 } 32 33 void push(int x) { 34 int i = ++pos; 35 for(; heap[i>>1] > x; i>>=1) { 36 heap[i] = heap[i>>1]; 37 } 38 heap[i] = x; 39 } 40 41 void pop() { 42 if(pos == 0) return; 43 int child = 1; 44 int i = 1; 45 int last = heap[pos--]; 46 for(; i<<1 <= pos; i=child) { 47 child = i<<1; 48 if(child != pos && heap[child] > heap[child+1]) { 49 ++child; 50 } 51 if(last > heap[child]) { 52 heap[i] = heap[child]; 53 } 54 else { 55 break; 56 } 57 } 58 heap[i] = last; 59 } 60 61 int n, k, x; 62 char cmd[2]; 63 64 int main() { 65 // freopen("in", "r", stdin); 66 while(~scanf("%d %d", &n, &k)) { 67 init(); 68 while(n--) { 69 scanf("%s", cmd); 70 if(cmd[0] == 'I') { 71 scanf("%d", &x); 72 if(pos < k) push(x); 73 else if(heap[1] < x) { 74 pop(); 75 push(x); 76 } 77 } 78 else { 79 printf("%d\n", heap[1]); 80 } 81 } 82 } 83 return 0; 84 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· 在线客服系统 QPS 突破 240/秒,连接数突破 4000,日请求数接近1000万次,.NET 多
· C# 开发工具Visual Studio 介绍
· 在 Windows 10 上实现免密码 SSH 登录
· C#中如何使用异步编程