zoukankan      html  css  js  c++  java
  • 二叉堆练习3&【模板】堆

    题目描述 Description

    给定N(N≤500,000)和N个整数(较有序),将其排序后输出。

    输入描述 Input Description

    N和N个整数

    输出描述 Output Description

    N个整数(升序)

    样例输入 Sample Input

    5

    12 11 10 8 9

    样例输出 Sample Output

    8 9 10 11 12

    数据范围及提示 Data Size & Hint

    对于33%的数据 N≤10000

    对于另外33%的数据 N≤100,000  0≤每个数≤1000

    对于100%的数据 N≤500,000  0≤每个数≤2*10^9

     代碼實現:

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 int n,a,b,c,dp,ado,rec;
     5 int heap[600000];//數組要開的大一些。
     6 void put(int x){
     7     ++dp;
     8     heap[dp]=x;
     9     rec=dp;
    10     while(rec>1){
    11         if(heap[rec]<heap[rec/2]){
    12             swap(heap[rec],heap[rec/2]);
    13             rec/=2;
    14         }
    15         else break;
    16     }
    17 }
    18 int get(){
    19     int d=1,e;
    20     rec=heap[d];
    21     heap[d]=heap[dp];
    22     dp--;
    23     while(d*2<=dp){
    24         if(heap[d*2]>heap[d*2+1]) c=d*2+1;
    25         else c=d*2;
    26         if(heap[d]>heap[c]){
    27             swap(heap[d],heap[c]);
    28             d=c;
    29         }
    30         else break;
    31     }
    32     return rec;
    33 }
    34 int main(){
    35     cin>>n;
    36     for(int i=1;i<=n;i++){
    37         cin>>a;
    38         put(a);
    39     }
    40     for(int i=1;i<=n;i++) printf("%d ",get());
    41     return 0;
    42 }

    一個堆排的裸題。

    题目来源:CODE[VS]

    题目描述

    如题,初始小根堆为空,我们需要支持以下3种操作:

    操作1: 1 x 表示将x插入到堆中

    操作2: 2 输出该小根堆内的最小数

    操作3: 3 删除该小根堆内的最小数

    输入输出格式

    输入格式:

    第一行包含一个整数N,表示操作的个数

    接下来N行,每行包含1个或2个正整数,表示三种操作,格式如下:

    操作1: 1 x

    操作2: 2

    操作3: 3

    输出格式:

    包含若干行正整数,每行依次对应一个操作2的结果。

    输入输出样例

    输入样例#1:
    5
    1 2
    1 5
    2
    3
    2
    输出样例#1:
    2
    5

    说明

    时空限制:1000ms,128M

    数据规模:

    对于30%的数据:N<=15

    对于70%的数据:N<=10000

    对于100%的数据:N<=1000000(注意是6个0。。。不过不要害怕,经过编者实测,堆是可以AC的)

    样例说明:

    故输出为2、5

    代码实现:

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 int n,a,b,c;
     5 int heap[5000000],k;
     6 void mai(int x){
     7     int lson=x*2,rson=x*2+1;
     8     if(lson>k) return;
     9     if(heap[lson]<heap[rson]||rson>k){
    10         if(heap[x]>heap[lson]){
    11             swap(heap[x],heap[lson]);
    12             mai(lson);
    13         }
    14     }
    15     else{
    16         if(heap[x]>heap[rson]){
    17             swap(heap[x],heap[rson]);
    18             mai(rson);
    19         }
    20     }
    21 }
    22 void put(int x){
    23     heap[++k]=x;
    24     c=k;
    25     while(heap[c]<heap[c/2]&&c/2){
    26         swap(heap[c],heap[c/2]);
    27         c/=2;
    28     }
    29 }
    30 void push(){
    31     heap[1]=heap[k--];
    32     mai(1);
    33 }
    34 int main(){
    35     scanf("%d",&n);
    36     for(int i=1;i<=n;i++){
    37         scanf("%d",&a);
    38         if(a==1){
    39             scanf("%d",&b);
    40             put(b);
    41         }
    42         if(a==2) printf("%d
    ",heap[1]);
    43         if(a==3) push();
    44     }
    45     return 0;
    46 }

    这份代码比上面的快。

    题目来源:洛谷

  • 相关阅读:
    Thinkphp中自己组合的数据怎样使用框架的分页
    CI框架不能有Index控制器
    购物车,修改数量错误
    TypeError: 'stepUp' called on an object that does not implement interface HTMLInputElement.
    OAuth2.0
    通过控制面板查看时间日志
    js再学习笔记
    Thinkphp验证码异步验证第二次及以后验证,验证错误----待解决
    cookie&&session再理解笔记
    markdown语法学习笔记
  • 原文地址:https://www.cnblogs.com/J-william/p/6238877.html
Copyright © 2011-2022 走看看