题目链接 总时间限制: 3000ms 内存限制: 65535kB 描述 定义一个数组,初始化为空。在数组上执行两种操作:
1、增添1个元素,把1个新的元素放入数组。
2、输出并删除数组中最小的数。
使用堆结构实现上述功能的高效算法。
输入 第一行输入一个整数t,代表测试数据的组数。 对于每组测试数据,第一行输入一个整数n,代表操作的次数。 每次操作首先输入一个整数type。 当type=1,增添操作,接着输入一个整数u,代表要插入的元素。 当type=2,输出删除操作,输出并删除数组中最小的元素。 1<=n<=100000。 输出 每次删除操作输出被删除的数字。 样例输入 1 2 3 4 5 6 7 8 9 10 11 12
| 2 5 1 1 1 2 1 3 2 2 4 1 5 1 1 1 7 2
|
样例输出 提示 每组测试数据的复杂度为O(nlgn)的算法才能通过本次,否则会返回TLE(超时) 需要使用最小堆结构来实现本题的算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std;
int heap[100010]; int len; //int maxsize;
void Init(){ //maxsize = 0; len = 0; }
void Insert(int x){ //heap[len] = x; len++;
int i = len -1;
while(i > 0){ int j = (i-1)/2; if(x > heap[j]) break; heap[i] = heap[j]; i = j; } heap[i] = x; }
int Del(){ if(0 == len){ exit(1); }
int temp = heap[0]; len--;
if(0 == len){ return temp; }
int x = heap[len]; int i = 0; int j = 2*i+1; while(j <= len-1){ if((j < len-1)&& (heap[j] > heap[j+1])){ j++; } if(x < heap[j]){ break; } heap[i] = heap[j]; i = j; j = 2*i+1; } heap[i] = x; return temp; }
int main(){ //freopen("in.txt","r",stdin); int t,n,type,x; scanf("%d",&t); while(t--){ scanf("%d",&n); //struct node p; Init(); while(n--){ scanf("%d",&type); if(type == 1){ scanf("%d",&x); Insert(x); } else if(type == 2) printf("%d\n",Del()); } } return 0; }
|
最后更新时间:
欢迎评论~