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 ...
随机推荐
- Webform(Repeater控件)
一.Repeater控件 有五大模板 ItemTemplate :有多少条数据,执行多少遍 AlternatingItemTemplate : 对交替数据项进行格式设置 Se ...
- [JS]东方财富网财经数据汇总代码示例
把握全球金融状况 一个页面看全球金融,感觉不错 再加上以前做的,读取显示 新浪7*24财经直播数据页面 那看得就更舒服了 下面是 新浪7*24财经直播数据 代码地址: http://www.cnblo ...
- basket.js 源码分析
basket.js 源码分析 一.前言 basket.js 可以用来加载js脚本并且保存到 LocalStorage 上,使我们可以更加精准地控制缓存,即使是在 http 缓存过期之后也可以使用.因此 ...
- SQL Server join介绍
介绍Inner Join(可以省略Inner,平常经常inner,就是inner join), Full Out Join,Cross Join,Left Join, Right Join区别. )) ...
- 树莓派版的家用NAS服务器
家里的文件越来越多,每个人的文件放得到处都是,需要的时候又找不到... 买个NAS服务器?太贵!太吵!太费电!... 好在我们有树莓派,自己动手,丰衣足食! 说做就做,主要分成以下三部分 加载双USB ...
- 【读书笔记】iOS-内存管理
Cocoa的内存管理:retain,release和autorelease. 每个对象都维护一个保留计数器.对象被创建时,其保留计数器值为1:对象被保留时,保留计数器值加1:对象被释放时,保留计数器值 ...
- Spring(五)AOP简述
一.AOP简述 AOP全称是:aspect-oriented programming,它是面向切面编号的思想核心, AOP和OOP既面向对象的编程语言,不相冲突,它们是两个相辅相成的设计模式型 AOP ...
- 斯坦福iOS7公开课4-6笔记及演示Demo
1.变量类型别滥用id,如果不仔细容易在程序执行时引发错误,因为在编译阶段编译器只是检测变量对象所属类型,尤其是类型为id时代表任何类型都可以通过检查,但不会检测变量对象调用的方法,这样当对象所属类不 ...
- 做一些Spring AOP做过的事,封装 jdk动态代理成为一个黑盒子
怎么使用eclise 抽取方法,请看 利用eclipse 抽取代码片段为方法 抽取完成之后,还需要 ① 将Collection.class换成 target.getClass(),targ ...
- JSON转换类(一)--过滤特殊字符,格式化字符型、日期型、布尔型
/// <summary> /// 过滤特殊字符 /// </summary> private static string String2Json(String s) { St ...