簡單的平衡二叉樹題,支援三個操作,插入、查詢最值、刪除,在結構體中用到了運算子多載,為了編碼方便,如果不用重載,應該會跑得更快。
My Code:
#include <cstdio><br />#include <cstring><br />#include <cstdlib><br />#include <algorithm><br />using namespace std;<br />const int MAX=1100000;<br />struct In{<br />int id;<br />int pro;</p><p>In(){}<br />In(int id,int pro):id(id),pro(pro){}<br />bool operator==(const In& in) const{<br />return id==in.id&&pro==in.pro;<br />}</p><p>bool operator<(const In& in) const{<br />if(pro!=in.pro){<br />return pro<in.pro;<br />}else{<br />return id<in.id;<br />}<br />}</p><p>bool operator<=(const In& in) const{<br />return *this<in||*this==in;<br />}</p><p>bool operator>(const In& in) const{<br />return !(*this<=in);<br />}</p><p>bool operator>=(const In& in) const{<br />return !(*this<in);<br />}<br />};<br />struct Node {<br /> int left, right, size, cnt;<br />In key;<br /> void init() {<br /> left = right = 0;<br /> size = 1;<br /> }<br />} node[MAX];<br />int tol;<br />int root;<br />void init(){<br />tol=root=0;<br />}<br />void Lt(int &t)<br />{<br /> int k = node[t].right;<br /> node[t].right = node[k].left;<br /> node[k].left = t;<br /> node[k].size = node[t].size;<br /> node[t].size = node[node[t].left].size + node[node[t].right].size + 1;<br /> t = k;<br /> return;<br />}<br />void Rt(int &t) {<br /> int k = node[t].left;<br /> node[t].left = node[k].right;<br /> node[k].right = t;<br /> node[k].size = node[t].size;<br /> node[t].size = node[node[t].left].size + node[node[t].right].size + 1;<br /> t = k;<br /> return;<br />}<br />void keep(int &t, bool flag) {<br /> if (flag == 0) {<br /> if (node[node[node[t].left].left].size > node[node[t].right].size)<br /> Rt(t);<br /> else if (node[node[node[t].left].right].size > node[node[t].right].size) {<br /> Lt(node[t].left);<br /> Rt(t);<br /> } else return;<br /> } else {<br /> if (node[node[node[t].right].right].size > node[node[t].left].size)<br /> Lt(t);<br /> else if (node[node[node[t].right].left].size > node[node[t].left].size) {<br /> Rt(node[t].right);<br /> Lt(t);<br /> } else return;<br /> }<br /> keep(node[t].left, 0);<br /> keep(node[t].right, 1);<br /> keep(t, 0);<br /> keep(t, 1);<br /> return;<br />}<br />void insert(int &t, const In& v) {<br /> if (t == 0) {<br /> t = ++tol;<br /> node[t].init();<br /> node[t].key = v;<br /> } else {<br /> node[t].size++;<br /> if (v < node[t].key)<br /> insert(node[t].left, v);<br /> else insert(node[t].right, v);<br /> keep(t, v >= node[t].key);<br /> }<br /> return;<br />}<br />int del(int &t, const In& v) {<br /> if (!t)<br /> return 0;<br /> node[t].size--;<br /> if (v == node[t].key || v < node[t].key && !node[t].left || v > node[t].key && !node[t].right) {<br /> if (node[t].left && node[t].right) {<br /> int p = del(node[t].left, In(v.id+1,v.pro));<br /> node[t].key = node[p].key;<br /> return p;<br /> } else {<br /> int p = t;<br /> t = node[t].left + node[t].right;<br /> return p;<br /> }<br /> } else return del(v < node[t].key ? node[t].left : node[t].right, v);<br />}<br />In select(int t, int k) {<br /> if (k <= node[node[t].left].size)<br /> return select(node[t].left, k);<br /> else if (k > node[node[t].left].size + 1)<br /> return select(node[t].right, k - node[node[t].left].size - 1);<br /> return node[t].key;<br />}<br />int getmax(int t) {<br /> while (node[t].right)<br /> t = node[t].right;<br /> return t;<br />}<br />int getmin(int t) {<br /> while (node[t].left)<br /> t = node[t].left;<br /> return t;<br />}<br />int main(){<br />int id,pro;</p><p>init();<br />while(scanf("%d",&id),id){<br />if(id==1){<br />scanf("%d%d",&id,&pro);<br />insert(root,In(id,pro));<br />}else if(id==2){<br />if(tol==0){<br />puts("0");<br />}else{<br />id=getmax(root);<br />printf("%d/n",node[id].key.id);<br />del(root,node[id].key);<br />}<br />}else{<br />if(tol==0){<br />puts("0");<br />}else{<br />id=getmin(root);<br />printf("%d/n",node[id].key.id);<br />del(root,node[id].key);<br />}<br />}<br />}</p><p>return 0;<br />}<br />