AC日记——手写堆ac合并果子(傻子)
今天整理最近的考试题
发现一个东西叫做优先队列
priority_queue(说白了就是大根堆)
但是
我对堆的了解还是很少的
所以
我决定手写一个堆
于是我写了一个简单的堆
手写的堆说白了就是个二叉树
能不更新维护的二叉树,每次维护的时间为logn
但是各种查询(empty,top什么的)时间为1;
感觉这个堆还写的像模像样
于是兴冲冲的去ac特别简单题合并果子
没a;
改了好久才ac
现在贴一下这个代码
来,上代码:
#include<cstdio> using namespace std; int heap[],num,jkl,cur,n,ans=; char ch; void swap(int &a,int &b)//交换函数
{
int t=a;
a=b,b=t;
} void qread(int &x)//读入优化
{
x=,jkl=;ch=getchar();
while(ch>''||ch<''){if(ch=='-') jkl=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+(int)(ch-'');ch=getchar();}
x*=jkl;
} void heap_up(int now)//向上维护(添加元素时)
{
if(now==) return;
int cnm=now/;
if(heap[cnm]>heap[now])
{
swap(heap[cnm],heap[now]);
heap_up(cnm);
}
} void heap_push(int kol)//添加元素同时维护
{
num++;
heap[num]=kol;
if(num==) return ;
heap_up(num);
} void heap_down(int now)//向下维护(删除元素时)
{
int l,r;
if(now*+<=num)
{
l=now*,r=now*+;
if(heap[l]<heap[now])
{
if(heap[r]<heap[l])
{
swap(heap[r],heap[now]);
heap_down(r);
}
else
{
swap(heap[l],heap[now]);
heap_down(l);
}
}
else
{
if(heap[r]<heap[now])
{
swap(heap[r],heap[now]);
heap_down(r);
}
}
}
else
{
if(now*<=num)
{
l=now*;
if(heap[l]<heap[now]) swap(heap[l],heap[now]);
}
}
} void heap_pop()//删除元素
{
heap[]=heap[num];
num--;
heap_down();
} int heap_top(){return heap[];}//查询堆顶元素 bool heap_empty(){return num==?true:false;}//查询是否为空 int main()
{
qread(n);
for(int i=;i<=n;i++)
{
qread(cur);
heap_push(cur);
}
for(int i=;i<n;i++)
{
cur=heap_top();
heap_pop();
cur+=heap_top();
heap_pop();
heap_push(cur);
ans+=cur;
}
printf("%d\n",ans);
return ;
}
AC日记——手写堆ac合并果子(傻子)的更多相关文章
- AC日记——二叉堆练习3 codevs 3110
3110 二叉堆练习3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 给定N(N≤500,000)和N个整 ...
- Luogu [P1334] 瑞瑞的木板(手写堆)
其实这个题完全不需要用手写堆,只需要一遍遍sort就行了…… 但是! 为了练习手写堆,还是用手写堆做了. 在做本题之前,如果你没有什么思路的话,建议先做Luogu的合并果子. 好,假设你已经做过了合并 ...
- spfa+剪枝 或者 dij+手写堆+剪枝 UOJ 111
http://uoj.ac/problem/111 好像NOIP里面的题目...有好多都是...能通过xjbg剪枝来...AC题目的? 得好好学一下这些剪枝黑科技了... 思路:我觉得这位大佬说的很完 ...
- 手写堆优化dijkstra
\(dijkstra\) 算法的堆优化,时间复杂度为\(O(n+m)\log n\) 添加数组\(id[]\)记录某节点在堆中的位置,可以避免重复入堆从而减小常数 而这一方法需要依托手写堆 #incl ...
- [转载] 管Q某犇借的手写堆
跟gxy大神还有yzh大神学了学手写的堆,应该比stl的优先队列快很多. 其实就是维护了一个二叉堆,写进结构体里,就没啥了... 据说达哥去年NOIP靠这个暴力多骗了分 合并果子... templat ...
- hihoCoder 第136周 优化延迟(二分答案+手写堆)
题目1 : 优化延迟 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho编写了一个处理数据包的程序.程序的输入是一个包含N个数据包的序列.每个数据包根据其重要程度不同 ...
- BZOJ 1975 魔法猪学院(A*+手写堆)
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1941 Solved: 595 [Submit][Sta ...
- 手写堆_C++
一般主程序中拿堆顶元素 x=h[]; h[]=h[top--]; down(); 在堆尾加入元素 h[++top]=x; up(top); 上浮下沉操作 inline void up(int x) { ...
- 手写堆的dijkstra
颓废.. #include <cstdio> #include <cstring> #include <algorithm> using namespace std ...
随机推荐
- Telegram传奇:俄罗斯富豪、黑客高手、极权和阴谋…
说了很久要写Telegram的故事,一直拖延没有写.在我拖延的这段时间里面,Telegarm继续快速增长,前几天,在旧金山的TechCrunch Disrupt活动上,创始人Durov说现在Teleg ...
- javascript --- 再谈词法分析
javascript代码是如何执行的呢,分为六个步骤(就像把大象装进冰箱总共分几步?): 第一步:载入第一个js代码段(注:script标签对内的代码或是引用js代码,这也说明js并不是一行一行(单纯 ...
- Jquery easyui Tree的简单使用
Jquery easyui Tree的简单使用 Jquery easyui 是jQuery EasyUI是一组基于jQuery的UI插件集合,而jQuery EasyUI的目标就是帮助web开发者更轻 ...
- How to Use Telnet to Test SMTP Communication
Topic Last Modified: 2005-05-24 Telnet is an extremely useful tool for troubleshooting issues relate ...
- Android-Application
1:Application是什么? Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个 application对 ...
- genymotion虚拟机启动失败
错误提示如下: Make sure that you have installed it correctly before starting Genymotion. 解决方法(重启VirtualBox ...
- 怎样在VS2010中打开VS2012的项目
VS2012中对C#的支持度非常好,不管是编写方便程度(不需要插件就能高亮代码及代码自动提示功能),还对MFC的一些功能优化很多. 我们可以修改两个工程文件来把VS2012的工程文件一直到VS2010 ...
- 生命游戏/Game of Life的Java实现(转)
首先简单介绍一下<生命游戏> 生命游戏其实是一个零玩家游戏.它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死 ...
- Cent OS服务器配置(JDK+Tomcat+MySQL)
本文摘自:Cent OS服务器配置(JDK+Tomcat+MySQL) 学习tar解压 解压 tar 文件 tar -zxvf apache-tomcat-6.0.35.tar.gz tomcat ...
- animation of android (1)
android把动画的模式分为:property animation,view animation,drawable animation. view animation:给出动画的起止状态,并且通过一 ...