題解 P3835 模板 可持久化平衡樹

2022-05-02 04:18:07 字數 1601 閱讀 8930

就是可持久化後的普通平衡樹嘛(逃

題目描述不寫了(懶了

這裡是題目

inline int merge(int x, int y)  else 

}inline void split(int rt, ll k, int &x, int &y) else

}}

然後開個root陣列,存各個版本的根節點,然後注意下空間就好了。記得開50倍,要不涼涼

#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define go(i,j,n,k) for(int i=j;i<=n;i+=k)

#define fo(i,j,n,k) for(int i=j;i>=n;i-=k)

#define rep(i,x) for(int i=h[x];i;i=e[i].nxt)

#define mn 500010

#define ld long double

#define fi first

#define se second

#define inf 1<<30

#define ll long long

#define root 1,n,1

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define bson l,r,rt

inline ll read()

while(ch>='0'&&ch<='9')

return x*f;

}struct edge z[mn * 50];

int rot[mn], xx, yy, zz, n, cnt;

inline void update(int rt)

inline int newnode(ll w = 0)

inline int merge(int x, int y) else

}inline void split(int rt, ll k, int &x, int &y) else

}}inline int findkth(int rt, int k)

}}int main() else if(s == 2) else if(s == 3) else if(s == 4) else if(s == 5)

printf("%lld\n", z[findkth(xx, z[xx].sze)].w);

rot[i] = merge(xx, yy);

} else if(s == 6)

printf("%lld\n", z[findkth(yy, 1)].w);

rot[i] = merge(xx, yy);}}

return 0;

}

upd on 12.09:

此題有點坑,首先要開long long, 否則就會炸。在split中的引數k也要有long long型。

其次記得邊界(好像這道題不卡),就是邊界輸出(-)2147483647。

P3835 模板 可持久化平衡樹

您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 對於各個以往的歷史版本 插入x數 刪除x數 若有多個相同的數,因只刪除乙個,如果沒有請忽略該操作 查詢x數的排名 排名定義為比當前數小的數的個數 1。若有多個相同的數,因輸出最小的排名 查詢排名為x的數 求x的前驅 前驅定義為...

洛谷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...