今天整理最近的考试题

发现一个东西叫做优先队列

priority_queue(说白了就是大根堆)

但是

我对堆的了解还是很少的

所以

我决定手写一个堆

于是我写了一个简单的堆

手写的堆说白了就是个二叉树

能不更新维护的二叉树,每次维护的时间为logn

但是各种查询(empty,top什么的)时间为1;

感觉这个堆还写的像模像样

于是兴冲冲的去ac特别简单题合并果子

没a;

改了好久才ac

现在贴一下这个代码

来,上代码:

  1. #include<cstdio>
  2.  
  3. using namespace std;
  4.  
  5. int heap[],num,jkl,cur,n,ans=;
  6.  
  7. char ch;
  8.  
  9. void swap(int &a,int &b)//交换函数
  10. {
  11. int t=a;
  12. a=b,b=t;
  13. }
  14.  
  15. void qread(int &x)//读入优化
  16. {
  17. x=,jkl=;ch=getchar();
  18. while(ch>''||ch<''){if(ch=='-') jkl=-;ch=getchar();}
  19. while(ch>=''&&ch<=''){x=x*+(int)(ch-'');ch=getchar();}
  20. x*=jkl;
  21. }
  22.  
  23. void heap_up(int now)//向上维护(添加元素时)
  24. {
  25. if(now==) return;
  26. int cnm=now/;
  27. if(heap[cnm]>heap[now])
  28. {
  29. swap(heap[cnm],heap[now]);
  30. heap_up(cnm);
  31. }
  32. }
  33.  
  34. void heap_push(int kol)//添加元素同时维护
  35. {
  36. num++;
  37. heap[num]=kol;
  38. if(num==) return ;
  39. heap_up(num);
  40. }
  41.  
  42. void heap_down(int now)//向下维护(删除元素时)
  43. {
  44. int l,r;
  45. if(now*+<=num)
  46. {
  47. l=now*,r=now*+;
  48. if(heap[l]<heap[now])
  49. {
  50. if(heap[r]<heap[l])
  51. {
  52. swap(heap[r],heap[now]);
  53. heap_down(r);
  54. }
  55. else
  56. {
  57. swap(heap[l],heap[now]);
  58. heap_down(l);
  59. }
  60. }
  61. else
  62. {
  63. if(heap[r]<heap[now])
  64. {
  65. swap(heap[r],heap[now]);
  66. heap_down(r);
  67. }
  68. }
  69. }
  70. else
  71. {
  72. if(now*<=num)
  73. {
  74. l=now*;
  75. if(heap[l]<heap[now]) swap(heap[l],heap[now]);
  76. }
  77. }
  78. }
  79.  
  80. void heap_pop()//删除元素
  81. {
  82. heap[]=heap[num];
  83. num--;
  84. heap_down();
  85. }
  86.  
  87. int heap_top(){return heap[];}//查询堆顶元素
  88.  
  89. bool heap_empty(){return num==?true:false;}//查询是否为空
  90.  
  91. int main()
  92. {
  93. qread(n);
  94. for(int i=;i<=n;i++)
  95. {
  96. qread(cur);
  97. heap_push(cur);
  98. }
  99. for(int i=;i<n;i++)
  100. {
  101. cur=heap_top();
  102. heap_pop();
  103. cur+=heap_top();
  104. heap_pop();
  105. heap_push(cur);
  106. ans+=cur;
  107. }
  108. printf("%d\n",ans);
  109. return ;
  110. }

AC日记——手写堆ac合并果子(傻子)的更多相关文章

  1. AC日记——二叉堆练习3 codevs 3110

    3110 二叉堆练习3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 给定N(N≤500,000)和N个整 ...

  2. Luogu [P1334] 瑞瑞的木板(手写堆)

    其实这个题完全不需要用手写堆,只需要一遍遍sort就行了…… 但是! 为了练习手写堆,还是用手写堆做了. 在做本题之前,如果你没有什么思路的话,建议先做Luogu的合并果子. 好,假设你已经做过了合并 ...

  3. spfa+剪枝 或者 dij+手写堆+剪枝 UOJ 111

    http://uoj.ac/problem/111 好像NOIP里面的题目...有好多都是...能通过xjbg剪枝来...AC题目的? 得好好学一下这些剪枝黑科技了... 思路:我觉得这位大佬说的很完 ...

  4. 手写堆优化dijkstra

    \(dijkstra\) 算法的堆优化,时间复杂度为\(O(n+m)\log n\) 添加数组\(id[]\)记录某节点在堆中的位置,可以避免重复入堆从而减小常数 而这一方法需要依托手写堆 #incl ...

  5. [转载] 管Q某犇借的手写堆

    跟gxy大神还有yzh大神学了学手写的堆,应该比stl的优先队列快很多. 其实就是维护了一个二叉堆,写进结构体里,就没啥了... 据说达哥去年NOIP靠这个暴力多骗了分 合并果子... templat ...

  6. hihoCoder 第136周 优化延迟(二分答案+手写堆)

    题目1 : 优化延迟 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho编写了一个处理数据包的程序.程序的输入是一个包含N个数据包的序列.每个数据包根据其重要程度不同 ...

  7. BZOJ 1975 魔法猪学院(A*+手写堆)

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1941  Solved: 595 [Submit][Sta ...

  8. 手写堆_C++

    一般主程序中拿堆顶元素 x=h[]; h[]=h[top--]; down(); 在堆尾加入元素 h[++top]=x; up(top); 上浮下沉操作 inline void up(int x) { ...

  9. 手写堆的dijkstra

    颓废.. #include <cstdio> #include <cstring> #include <algorithm> using namespace std ...

随机推荐

  1. [TypeScript] TypeScript对象转JSON字符串范例

    [TypeScript] TypeScript对象转JSON字符串范例 Playground http://tinyurl.com/njbrnrv Samples class DataTable { ...

  2. Vue自带的过滤器

    gitHub地址:https://github.com/lily1010/vue_learn/tree/master/lesson05 一 过滤器写法 {{ message | Filter}} 二 ...

  3. javascript宿主对象之window.navigator

    window.navigator用来反映浏览器及其功能信息的对象. // 检测浏览器版本信息 function getBrowserInfo(){ var Sys = {}; var ua = win ...

  4. SharePoint 2010 文档管理之文档推送

    前言:文档推送功能,不是一个复杂的功能,我们这里简单的应用了Ribbon定制.Js使用.对象模型推送(Server端),下面,我们来简单介绍下文档推送功能吧. 一. 功能设计: 文档推送功能,主要就是 ...

  5. SeismicPro地震剖面显示程序

    SeismicPro是一个地震剖面显示软件,可从标准SEGY地震数据体中抽取纵测线和横测线的二维剖面,并以波形.变面积和变密度等多种方式进行专业化显示,可进行一键式显示方式切换,并可进行定制开发叠加井 ...

  6. Android 身份证号码查询、手机号码查询、天气查询

    1.基本信息 身份证号码查询:http://apistore.baidu.com/apiworks/servicedetail/113.html 手机号码:http://apistore.baidu. ...

  7. 【转】Visual Studio 非常实用的调试技巧

    下面有从浅入深的6个问题,您可以尝试回答一下 一个如下的语句for (int i = 0; i < 10; i++){if (i == 5)j = 5;},什么都写在一行,你怎么在j=5前面插入 ...

  8. Effective Java 54 Use native methods judiciously

    Java Native Interface(JNI) allows Java applications to call native methods, which are special method ...

  9. C语言指针学习

    C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...

  10. Web Application Project is configured to use IIS. Unable to access the IIS metabase.(配置为使用IIS Web应用程序xxxx项目。无法访问IIS元数据库。)

    这几天重装系统,装了win10,居然用vs2013打开项目出现下面这个提示错误,搞了很久才知道原因: Even though I am an administrator on the machine, ...