• 838. 堆排序,


    完全二叉树手写小根堆

    堆排序的五大功能
    1.插入一个数
    2.求集合当中的最小值
    3.删除最小值
    4.删除任意一个元素
    5.修改任意一个元素
    最后两个功能stl中的堆即优先队列都没法直接实现

                                            838. 堆排序

    838. 堆排序 - AcWing题库

    输入一个长度为 n 的整数数列,从小到大输出前 m 小的数。

    输入格式

    第一行包含整数 n 和 m。

    第二行包含 n 个整数,表示整数数列。

    输出格式

    共一行,包含 m 个整数,表示整数数列中前 m 小的数。

    数据范围

    1≤m≤n≤105,
    1≤数列中元素≤109

    输入样例:
    1. 5 3
    2. 4 5 1 3 2
    输出样例:
    1 2 3

     解析:

    此代码的第一次排序时间复杂的为 O(n)

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. using namespace std;
    15. typedef long long LL;
    16. const int N = 1e5 + 5, M = 3e5 + 5;
    17. int n, m;
    18. int h[N],cnt;
    19. void down(int u) {
    20. int t = u;
    21. if (u * 2 <= cnt && h[2 * u] < h[t])t = 2 * u;
    22. if (2 * u + 1 <= cnt && h[2 * u + 1] < h[t])t = 2 * u + 1;
    23. if (u != t) {
    24. swap(h[t], h[u]);
    25. down(t);
    26. }
    27. }
    28. int main() {
    29. cin >> n >> m;
    30. for (int i = 1; i <= n; i++)scanf("%d", &h[i]);
    31. cnt = n;
    32. for (int i = n / 2; i; i--)down(i);//时间复杂度为 O(n)
    33. while (m--) {
    34. printf("%d ", h[1]);
    35. h[1] = h[cnt];
    36. cnt--;
    37. down(1);
    38. }
    39. return 0;
    40. }

                                      839. 模拟堆

    839. 模拟堆 - AcWing题库

    维护一个集合,初始时集合为空,支持如下几种操作:

    1. I x,插入一个数 x;
    2. PM,输出当前集合中的最小值;
    3. DM,删除当前集合中的最小值(数据保证此时的最小值唯一);
    4. D k,删除第 k 个插入的数;
    5. C k x,修改第 k 个插入的数,将其变为 x;

    现在要进行 N 次操作,对于所有第 22 个操作,输出当前集合的最小值。

    输入格式

    第一行包含整数 N。

    接下来 N 行,每行包含一个操作指令,操作指令为 I xPMDMD k 或 C k x 中的一种。

    输出格式

    对于每个输出指令 PM,输出一个结果,表示当前集合中的最小值。

    每个结果占一行。

    数据范围

    1≤N≤105
    −109≤x≤109
    数据保证合法。

    输入样例:
    1. 8
    2. I -10
    3. PM
    4. I -10
    5. D 1
    6. C 2 8
    7. I 6
    8. PM
    9. DM
    输出样例:
    1. -10
    2. 6

     解析:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. using namespace std;
    15. typedef long long LL;
    16. const int N = 1e5 + 5, M = 3e5 + 5;
    17. int n,m;
    18. int h[N], hp[N], ph[N], cnt;
    19. void heapswap(int a, int b) {
    20. swap(hp[ph[a]], hp[ph[b]]);
    21. swap(ph[a], ph[b]);
    22. swap(h[a], h[b]);
    23. }
    24. void down(int u) {
    25. int t = u;
    26. if (2 * u <= cnt && h[2 * u] < h[t]) t = 2 * u;
    27. if (2 * u + 1 <= cnt && h[2 * u + 1] < h[t])t = 2 * u + 1;
    28. if (u != t) {
    29. heapswap(u, t);
    30. down(t);
    31. }
    32. }
    33. void up(int u) {
    34. while (u / 2 != 0 && h[u] < h[u / 2]) {
    35. heapswap(u, u / 2);
    36. u /= 2;
    37. }
    38. }
    39. int main() {
    40. scanf("%d", &n);
    41. char op[10];
    42. int x;
    43. while (n--) {
    44. scanf("%s", op);
    45. if (!strcmp("I", op)) {
    46. scanf("%d", &x);
    47. cnt++;
    48. m++;
    49. hp[m] = cnt, ph[cnt] = m;
    50. h[cnt] = x;
    51. up(cnt);
    52. }
    53. else if (!strcmp("PM", op)) {
    54. printf("%d\n", h[1]);
    55. }
    56. else if (!strcmp("DM", op)) {
    57. heapswap(1, cnt);
    58. cnt--;
    59. down(1);
    60. }
    61. else if (!strcmp("D", op)) {
    62. scanf("%d", &x);
    63. int k = hp[x];
    64. heapswap(k, cnt);
    65. cnt--;
    66. up(k);
    67. down(k);
    68. }
    69. else {
    70. int k;
    71. scanf("%d%d", &k, &x);
    72. h[hp[k]] = x;
    73. up(hp[k]);
    74. down(hp[k]);
    75. }
    76. }
    77. return 0;
    78. }

  • 相关阅读:
    python部署项目为什么要用Nginx和uWSGI
    linux用户管理,用户权限命令详解
    MapUtil从map结构中获取深度的信息
    java计算机毕业设计基于springboo+vue的准妈妈孕期育儿婴幼儿交流平台
    Maven中央仓库
    MATLAB算法实战应用案例精讲-【图像处理】机器视觉(基础篇)(五)
    怎么将自己拍摄的视频静音?详细步骤教会你~
    SequoiaDB分布式数据库2022.7月刊
    数据分析-Pandas如何画自相关图
    微信小程序(组件)----上传单张图片以及获取图片【wx.chooseMedia wx.uploadFile】
  • 原文地址:https://blog.csdn.net/Landing_on_Mars/article/details/134098515