題目大意:
來維護一些數,其中需要提供以下操作(對於各個以往的歷史版本):
插入x數
刪除x數(若有多個相同的數,因只刪除乙個,如果沒有請忽略該操作)
查詢x數的排名(排名定義為比當前數小的數的個數+1。若有多個相同的數,因輸出最小的排名)
查詢排名為x的數
求x的前驅(前驅定義為小於x,且最大的數,如不存在輸出-2147483647)
求x的後繼(後繼定義為大於x,且最小的數,如不存在輸出2147483647)
和原本平衡樹不同的一點是,每一次的任何操作都是基於某乙個歷史版本,同時生成乙個新的版本。(操作3, 4, 5, 6即保持原版本無變化)
每個版本的編號即為操作的序號(版本0即為初始狀態,空樹)
題解:可持久化平衡樹,就是在merge和split的時候不修改原來的點,改為新增乙個點存放
卡點:1.未考慮第一次插入因為樹中沒有節點,與其他的不同,需要特殊考慮,而導致後面出錯
c++ code:
#include #include #define maxn 500010using namespace std;
const int inf = 2147483647;
int n, ver, op, x;
int root[maxn];
struct tree
void cpy(int cur, int ver)
void update(int rt)
int nw(int p)
void split(int rt, int p, int &x, int &y) else
} }int merge(int x, int y) else
update(o);
return o;
} void insert(int &rt, int x)
} void erase(int &rt, int x)
int gtrnk(int rt, int x)
int gtkth(int rt, int k)
} }int pre(int rt, int x)
int nxt(int rt, int x)
} t;
int main()
case 2:
case 3:
case 4:
case 5:
case 6:
} }return 0;
}
洛谷P3835 模板 可持久化平衡樹
本題為題目 普通平衡樹 的可持久化加強版。資料已經經過強化 插入x數 刪除x數 若有多個相同的數,因只刪除乙個,如果沒有請忽略該操作 查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 查詢排名為x的數 求x的前驅 前驅定義為小於x,且最大的數,如不存在輸出 21...
洛谷 P3835 模板 可持久化平衡樹
可持久化平衡樹 可持久化 treap 1.插入 x 2.刪除 x 3.查詢 x 的排名 4.查詢排名為 x 的數 5.求 x 的前驅 6.求 x 的後繼 每次操作都基於某一歷史版本,同時生成乙個新的版本 include include include define maxn 500010 using...
洛谷 P3835 模板 可持久化平衡樹
題目傳送門 洛谷p3835。題意簡述 題面說的很清楚了。題解 考慮建立一棵每個節點都表示乙個版本的樹。以初始版本 0 為根。對於第 i 個操作,從 v i 向 i 連一條邊,而邊權則是 opt i 和 x i 的二元組,表示經過這條邊上操作,可以達到下乙個狀態。考慮使用權值樹狀陣列維護操作。只需要實...