[转载] 管Q某犇借的手写堆
跟gxy大神还有yzh大神学了学手写的堆,应该比stl的优先队列快很多。
其实就是维护了一个二叉堆,写进结构体里,就没啥了。。。
据说达哥去年NOIP靠这个暴力多骗了分
合并果子。。。
1 template<class T> struct heap{//小根堆 2 T q[mxn<<2];int sz; 3 heap(){sz=0;} 4 inline void push(T x){ 5 q[++sz]=x; 6 for(int i=sz,j=i>>1;j;i=j,j>>=1) 7 if(q[i]<q[j]) swap(q[i],q[j]); 8 else break; 9 } 10 inline void pop(){ 11 q[1]=q[sz--]; 12 for(int i=1,j=i<<1;j<=sz;i=j,j=i<<1){ 13 if((j|1)<=sz&&q[j|1]<q[j]) j|=1; 14 if(q[j]<q[i]) swap(q[i],q[j]); 15 else break; 16 } 17 } 18 inline const T top(){return q[1];} 19 }; 20 heap<data> h1,h2;