:warning: マージ可能ヒープ(SkewHeap)
(data_structure/skew_heap.hpp)

Code

#pragma once

/**
 * @brief マージ可能ヒープ(SkewHeap)
 */

template<typename T>
class skew_heap{
	struct node;
	using np=node*;
	struct node{
		np ch[2]={nullptr,nullptr};
		T val;
		node(T val):val(val){}
	};
	np root=nullptr;
	np meld(np a,np b) {
		if(!a||!b)return a?a:b;
		if(a->val>b->val)swap(a,b);
		a->ch[1]=meld(a->ch[1],b);
		swap(a->ch[0],a->ch[1]);
		return a;
	}
	public:
	skew_heap(np root=nullptr):root(root){}
    bool empty(){return !root;}
	void insert(T val){root=meld(root,new node(val));}
	void pop(){root=meld(root->ch[0],root->ch[1]);}
	T top(){return root->val;}
	np meld(skew_heap s,skew_heap t){return new skew_heap(meld(s->root,t->root));}
};
#line 2 "data_structure/skew_heap.hpp"

/**
 * @brief マージ可能ヒープ(SkewHeap)
 */

template<typename T>
class skew_heap{
	struct node;
	using np=node*;
	struct node{
		np ch[2]={nullptr,nullptr};
		T val;
		node(T val):val(val){}
	};
	np root=nullptr;
	np meld(np a,np b) {
		if(!a||!b)return a?a:b;
		if(a->val>b->val)swap(a,b);
		a->ch[1]=meld(a->ch[1],b);
		swap(a->ch[0],a->ch[1]);
		return a;
	}
	public:
	skew_heap(np root=nullptr):root(root){}
    bool empty(){return !root;}
	void insert(T val){root=meld(root,new node(val));}
	void pop(){root=meld(root->ch[0],root->ch[1]);}
	T top(){return root->val;}
	np meld(skew_heap s,skew_heap t){return new skew_heap(meld(s->root,t->root));}
};
Back to top page