POJ 1442 Treap 板子記錄

2021-07-16 07:43:13 字數 1717 閱讀 4469

【題意】給乙個序列,然後給出m個查詢,每次查詢輸入乙個數x,對於第i次查詢,輸出前x個數中第i大的關鍵字的值。

【解題方法】就是裸treap板子了,先介紹一下treap。

treap是一棵二叉搜尋樹,只是每個節點多了乙個優先順序fix,對於每個節點,該節點的優先順序小於等於其所有孩子的優先順序。

當然,引入優先順序fix的目的就是防止bst退化成一條鏈,從而影響查詢效率。

所以,這樣看來就是:treap中對於節點的關鍵字key來說,它是一棵二叉搜尋樹,而對於fix來說,它是乙個最小堆,所以

treap可以看成是tree+heap,只是這裡的heap不一定是完全二叉樹。treap的平均時間複雜度為log(n).

treap跟笛卡爾樹幾乎是一模一樣的,只是用途不同。

笛卡爾樹是把已有的一些(key, fix)二元組拿來構造樹,然後利用構樹過程和構造好的樹來解決lca,rmq等等問題。而

treap的目的只是對一些key進行二叉搜尋,但是為了保證樹的平衡性,為每個key隨機地額外增加了乙個fix屬性,這樣從概

率上來講可以讓這棵樹更加平衡。

對於treap來說,主要有幾大操作:插入,刪除,查詢,旋轉,找第k大元素,找關鍵字x的排名,計算treap的高度,刪除

treap,其它的操作比如合併,分離,反轉等等以後再說,另外,對於treap來說,它的中序遍歷的結果就是按照關鍵字從小到

大的順序排列的。

【ac **】【板子記錄】

#include #include #include #include using namespace std;

struct treap

int compare(int x) const

};void rotate(treap* &t,int d)

void insert(treap* &t,int x)

t->maintain();

}//一般來說,在呼叫刪除函式之前要先用find()函式判斷該元素是否存在

void delete(treap* &t,int x)

else if(t->ch[1]==null)

else

}else delete(t->ch[d],x);

if(t!=null) t->maintain();

}bool find(treap *t,int x)

return false;

}int kth(treap *t,int k)

int rank(treap *t,int x)

void deletetreap(treap* &t)

void print(treap *t)

int val[1000010];

int main()

index=x+1;

printf("%d\n",kth(root,i));

}deletetreap(root);

}}

POJ 1442 Treap 插入 區間第k大

還是套板子直接求。author crazy 石頭 date 2014 05 08 time 313 ms algorithm treap 求區間第大數 pro poj 1442 include include include include include include include inclu...

POJ 1442 Black Box 優先佇列

優先佇列。剛開始用蠢辦法,經過乙個vector容器中轉,這麼一來一回這麼多趟,肯定超時啊。超時 如下 include include include include include include include include include include include using names...

poj1442 優先佇列oye

歷經磨難終於解決了這題,原來用stl可以這麼簡單 這題的思路 用stl弄2個優先佇列,big佇列優先彈出最小的,small佇列優先彈出最大的,若要求第i小的數字,只要滿足small佇列裡有i個元素,且small佇列的top比big佇列的top小,則small的top就是第i小的數字。關於優先佇列記住...