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 ...
随机推荐
- C安全编码--预处理
建议和规则 建议: 用内联函数或静态函数代替与函数相似的宏 在宏参数名两边加上括号 宏替换列表应该加上括号 应该使用typedef定义编码类型 不要复用标准头文件名 理解连接标记或执行字符串化时的宏替 ...
- C语言中void*详解及应用
void在英文中作为名词的解释为“空虚:空间:空隙”:而在C语言中,void被翻译为“无类型”,相应的void *为“无类型指针”.void似乎只有“注释”和限制程序的作用,当然,这里的“注释”不是为 ...
- 弃用的同步get和post请求
#import "ViewController.h" #import "Header.h" @interface ViewController () <N ...
- OC数组常见操作
// 数组存放的内容必须是NSObject对象,数组中存放的内容是有序的 // 数组打印输出在输出台是用()包括起来的 // NSArray 不可变数组 // 1.创建对象 // 初始化方法 NSAr ...
- 蓝牙防丢器原理、实现与Android BLE接口编程
本文是对已实现的蓝牙防丢器项目的总结,阐述蓝牙防丢器的原理.实现与android客户端的蓝牙BLE接口编程.在这里重点关注如何利用BLE接口来进行工程实现,对于BLE的协议.涉及到JNI的BLE接口内 ...
- WPF+Caliburn.Micro 杂记
开发过程中的小问题总结 1DataGrid的Header里面给Checkbox绑定IsEnabled,绑不上去. 2由A页面跳转到B页面,再由B页面返回一个值 3DataGrid里面的行通过一个方法 ...
- android 显示意图
//显示意图 public void enter(View view) { Intent intent = new Intent();//创建一个空的意图 intent.setClassName(ge ...
- Gleeo Time Tracker简明使用教程
转载一篇很不错的文章,这款软件还是非常实用的 1 简介 Gleeo Time Tracker是安卓平台下一款相当酷的项目时间记录和管理的软件.说他酷,是因为界面纯黑.而除了这点酷之外,功能也很简单实用 ...
- UVa 106 - Fermat vs Pythagoras(数论题目)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- Head First HTML CSS XHTML笔记
最近在看点前端的东西,看到了这本入门级的好书 <head></head>中的title和style <q></q> inline元素 在<p> ...