POJ 1442 Treap 插入 區間第k大

2021-06-21 23:30:11 字數 1235 閱讀 5819

還是套板子直接求。

/****************************

* author:crazy_石頭

* date:2014/05/08

* time:313 ms

* algorithm:treap-求區間第大數

* pro:poj 1442

***************************/

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std; #define inf 1<<29 #define eps 1e-8 #define a system("pause") #define rep(i,h,n) for(int i=(h);i<=(n);i++) #define ms(a,b) memset((a),(b),sizeof(a)) #define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1 #define ll long long #define mod 100000000 const int maxn=100000+5; const int maxm=100+10; struct node bool operator <(const node& rhs)const }; inline void rotate(node* &o,int d)//d==0表示左旋,d==1表示右旋; inline void insert(node* &o,int x)//先是普通插入,if(x_v

v?0:1);//不要用cmp函式,可能會有相同結點; insert(o->ch[d],x);//插入新結點,比較優先順序進行旋轉; if(o->ch[d]->r>o->r) rotate(o,d^1); } o->maintain();//維護結點o的資訊; } inline void remove(node* &o,int x) else } else remove (o->ch[d],x); if(o!=null) o->maintain(); } //查詢區間第k大數; inline int kth(node* o,int k) int a[maxn],n,m; int main() printf("%d\n",kth(rt,i)); } return 0; }

POJ 1442 Treap 板子記錄

題意 給乙個序列,然後給出m個查詢,每次查詢輸入乙個數x,對於第i次查詢,輸出前x個數中第i大的關鍵字的值。解題方法 就是裸treap板子了,先介紹一下treap。treap是一棵二叉搜尋樹,只是每個節點多了乙個優先順序fix,對於每個節點,該節點的優先順序小於等於其所有孩子的優先順序。當然,引入優...

區間第K大(POJ 2104)

可持久化線段樹不是一顆完全二叉樹,所以不能用層次序編號,而應該直接記錄每個節點的左 右子節點的編號。可持久化線段樹維護了每次操作後線段樹的歷史形態。下面舉個簡單的例子來理解一下 以poj 2104為例 這棵樹是一顆不用修改的線段樹 題意 即多次查詢,查詢區間第k大的數。主席樹的學習 區間第k大 區間...

poj2104 主席樹區間第k大

主席樹裸題,過了好久都快忘了。主席樹主要就是使多個線段樹並行於一顆樹中,儲存的是一段區間內數字出現的個數,所以先離散化。數字的更改只影響了一條從這個葉子節點到根的路徑,所以只有這條路徑是新的,其他的都沒有改變。比如對於某個節點,要往右邊走,那麼左邊那些就不用新建,只要用個指標鏈到原樹的此節點左邊就可...