- 总时间限制:
- 3000ms
- 内存限制:
- 65535kB
- 描述
-
定义一个数组,初始化为空。在数组上执行两种操作:
1、增添1个元素,把1个新的元素放入数组。
2、输出并删除数组中最小的数。
使用堆结构实现上述功能的高效算法。
- 输入
- 第一行输入一个整数t,代表测试数据的组数。
对于每组测试数据,第一行输入一个整数n,代表操作的次数。
每次操作首先输入一个整数type。
当type=1,增添操作,接着输入一个整数u,代表要插入的元素。
当type=2,输出删除操作,输出并删除数组中最小的元素。
1<=n<=100000。 - 输出
- 每次删除操作输出被删除的数字。
-
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 #define maxn 100005 5 6 long sz, heap[maxn]; 7 8 9 void Insert(int x) 10 { 11 int i = sz++; 12 while (i > 0) { 13 int p = (i - 1) >> 1; 14 if (heap[p] > x) { 15 heap[i] = heap[p]; 16 i = p; 17 } 18 else break; 19 } 20 heap[i] = x; 21 } 22 23 void GetTop() 24 { 25 long ans = heap[0]; 26 printf("%ld\n", ans); 27 long x = heap[--sz]; 28 long i = 0; 29 while ((i << 1) + 1 < sz) { 30 long left = (i << 1) + 1; 31 long right = (i << 1) + 2; 32 if (right < sz && heap[right] < heap[left]) 33 left = right; 34 if (heap[left] >= x)break; 35 heap[i] = heap[left]; 36 i = left; 37 } 38 heap[i] = x; 39 } 40 41 int main() 42 { 43 int t, n; 44 cin >> t; 45 while (t--) { 46 sz = 0; 47 memset(heap, 0, sizeof(heap)); 48 cin >> n; 49 while (n--) { 50 int type; 51 long u; 52 cin >> type; 53 if (type == 1) { 54 cin >> u; 55 Insert(u); 56 } 57 else if (type == 2) 58 GetTop(); 59 } 60 } 61 //system("pause"); 62 return 0; 63 }
原文地址:https://www.cnblogs.com/Jeffrey-Y/p/10162270.html
时间: 2024-10-11 09:43:36