Pairing heap
其实挺好写的。。。(大雾)
理性愉悦大法好。。。
#include<cstdio>
#include<algorithm>
namespace utils{
template<class T>inline void swp(T&a,T&b){
T c=a; a=b, b=c;
}
}using namespace utils;
namespace mempool{
template<class D,int n=100010>struct pool{
D p[n],*k,*s[n],**st;
pool(){
k=p; st=s;
}
inline D*operator()(){
if(st!=s) return *(--st);
return k++;
}
inline void operator[](D*p){
*(st++)=p;
}
};
}
#define tcd template<class D>
#define pnd PN<D>
namespace PHeap{
tcd struct PN{
PN<D>*ch,*pr,*nx;
D data;
};
tcd inline pnd*merge(pnd*a,pnd*b){
if(!b) return a;
if(!a) return b;
if(b->data < a->data) swp(a,b);
b->nx=a->ch; if(a->ch) a->ch->pr=b;
a->ch=b; b->pr=a;
return a;
}
tcd inline pnd*cut(pnd*b){
if(!b)return 0;
if(b->pr){
if(b->pr->ch==b) b->pr->ch=b->nx;
else b->pr->nx=b->nx;
}
if(b->nx)b->nx->pr=b->pr;
b->pr=0,b->nx=0;
return b;
}
tcd inline pnd*decKey(pnd*Root,pnd*node,int amount){
if(Root==node) return Root->data-=amount,Root;
node->data-=amount;
node=cut(node);
return merge(Root,node);
}
tcd inline pnd*Merge_pairing(pnd*fake_root){
static pnd*Arr[100010],**kh;
if(!fake_root) return 0;
int len=0;
kh=Arr;
while(fake_root){
++len;
*kh=fake_root;
fake_root=fake_root->nx;
(*kh)->pr=0; (*kh)->nx=0;
++kh;
}
for(int i=0,_=len&(-2);i<_;i+=2){
Arr[i]=merge(Arr[i],Arr[i+1]);
}
if(len&1) fake_root=Arr[len^1]; else fake_root=0;
for(int i=(len-2)&(-2);i>=0;i-=2){
fake_root=merge(fake_root,Arr[i]);
}
return fake_root;
}
tcd inline pnd*pop(pnd*&heap){
pnd*r=heap;
heap=heap->ch;
if(heap) heap->pr=0;
r->ch=0;
heap=Merge_pairing(heap);
return r;
}
tcd inline pnd*show(pnd*k){//whatever you want...
//the fact is I had written this but I deleted by mistake...
}
} using namespace PHeap;
namespace debug_suit{
struct Packaged_int{
int a,id;
inline Packaged_int&operator-=(int b){
return a-=b,*this;
}
inline void print(){
printf("#%d[%d]",id,a);
}
inline bool operator<(Packaged_int b){
return a<b.a;
}
};
}using namespace debug_suit;
typedef PN<Packaged_int> PI;
mempool::pool<PI> All;
PI*nodes[100010];
int main(){
int now=0,d,p,r;
PI*n,*R;
char operate[30];
for(int i=0;i<20;++i){
nodes[now]=All();
nodes[now]->data=(Packaged_int){i,now};
++now;
}
for(int i=1;i<20;++i){
merge(nodes[0],nodes[i]);
}
while(~scanf("%s",operate)){
switch(operate[0]){
case 'S':
//show
scanf("%d",&d);
show(nodes[d]);
break;
case 'N':
//new
nodes[now]=All();
scanf("%d",&d);
nodes[now]->data=(Packaged_int){d,now};
++now;
break;
case 'I':
//is root
scanf("%d",&d);
printf("%s\n",nodes[d]->pr?"No":"Yes");
break;
case 'M':
scanf("%d%d",&d,&p);
if(nodes[d]->pr || nodes[p]->pr){
printf("Not roots, break.\n");
break;
}
R=merge(nodes[d],nodes[p]);
R->data.print();
break;
case 'R':
scanf("%d%d%d",&d,&p,&r);
if(p<0){
printf("p>0\n");
break;
}
if(nodes[r]->pr){
printf("Not root, break.\n");
break;
}
///no real root checking is performed; A disjoint set is required to do so...
decKey(nodes[r],nodes[d],p);
break;
case 'T':
scanf("%d",&r);
if(nodes[r]->pr){
printf("Not root, break.\n");
break;
}
nodes[r]->data.print();
break;
case 'P':
scanf("%d",&r);
if(nodes[r]->pr){
printf("Not root, break.\n");
break;
}
n=nodes[r];
pop(n);
printf("New root:\n");
n->data.print();
break;
case 'A':
printf("Show all\n");
for(int i=0;i<now;++i) nodes[i]->data.print(),putchar('\n');
break;
case 'Q':
return 0;
}
}
return 0;
}
Pairing heap的更多相关文章
- BZOJ 3040 最短路 (堆优化dijkstra)
这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...
- bzoj3011 可并堆
我们可以遍历得出每个节点到根节点的距离h,然后用可并堆进行维护.树形dp 我用的是pairing heap #include<cstdio> #include<algorithm&g ...
- Dijkstra 算法——计算有权最短路径(边有权值)
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在理解 Dijkstra 的思想并用源代码加以实现: 0.2)最短路径算法的基础知识,参见 http://blog. ...
- 算法导论——lec 12 平摊分析与优先队列
在平摊分析中,运行一系列数据结构操作所须要的时间是通过对运行的全部操作求平均得出.反映在不论什么情况下(即最坏情况下),每一个操作具有平均性能.掌握了平摊分析主要有三种方法,聚集分析.记账方法.势能方 ...
- 在 Prim 算法中使用 pb_ds 堆优化
在 Prim 算法中使用 pb_ds 堆优化 Prim 算法用于求最小生成树(Minimum Spanning Tree,简称 MST),其本质是一种贪心的加点法.对于一个各点相互连通的无向图而言,P ...
- java head space/ java.lang.OutOfMemoryError: Java heap space内存溢出
上一篇JMX/JConsole调试本地还可以在centos6.5 服务器上进行监控有个问题端口只开放22那么设置的9998端口 你怎么都连不上怎么监控?(如果大神知道还望指点,个人见解) 线上项目出现 ...
- Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)
--reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...
- [数据结构]——堆(Heap)、堆排序和TopK
堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...
- Windbg Extension NetExt 使用指南 【3】 ---- 挖掘你想要的数据 Managed Heap
摘要 : NetExt中有两个比较常用的命令可以用来分析heap上面的对象. 一个是!wheap, 另外一个是!windex. !wheap 这个命令可以用于打印出heap structure信息. ...
随机推荐
- Ubuntu下如何安装YouCompleteMe插件
Ubuntu安装YouCompleteMe插件 简介: 众所周知, Vim是一款linux下的文本编辑器, 其最基础的工作就是编辑文本,而不管该文本的内容是什么. 在Vim被程序员所使用后,其慢慢的被 ...
- servlet的九大内置对象
隐式对象 说明 request 转译后对应HttpServletRequest/ServletRequest对象 response 转译后对应HttpServletRespons/ServletRes ...
- 做技术最自由,在IT最幸福!
这些天来,一直感觉"做技术最自由,在IT最幸福!" 在IT最幸福 一直感觉从事IT行业最幸福,想想那些干机械的.干汽修.地勤的,让我干那些工作,对我来说真是折磨! 大体总结以下几点 ...
- Java WebService入门实例
Web Services是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务. Web Service的关键技术和规则: 1.XML:描述 ...
- jquery自定义函数的多种方法
在jquery中自定义函数你会吗?今天抽时间写了几个,个人感觉还不错,喜欢的朋友可以了解下 复制代码 代码如下: //方法定义 $.windowbox = { //定义一个方法aa aa: fun ...
- 导入excel错误:外部表不是预期的格式 解决方案
环境:win7+iis7+Office2007 在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一 ...
- 为什么构造器不能是abstract, static, final, native or synchronized的?
Unlike methods, a constructor cannot be abstract, static, final, native or synchronized. 1. A const ...
- shell学习之路:流程控制(if)
1.单分支if条件语句 if [ 条件判断式 ];then 程序 fi 或者 if [ 条件判断式 ] then 程序 fi 注意事项: 1.if语句使用fi结尾,和一般语言使用大括号结尾不同 2.[ ...
- google-breakpad
BUG收集系统: 国内可以使用友盟,国外可以使用Crashlytics SDK,或者自己实现使用 google-breakpad,参见下列文章: Crashlytics SDK 部分: http:// ...
- 工具介绍 - NimbleText
非常实用的工具, 即使不是程序员也有必要掌握这个简单的小工具. 这个工具有桌面版和在线版两个版本. 桌面版地址: http://nimbletext.com/ 在线版地址: http://nimble ...