考慮二分求lis的過程,就是維護乙個序列,其中第i個數表示長度為i的最小結尾,而插入操作就是查詢第乙個大於x的位置並替換掉
用線段樹維護,二分的過程也可以用線段樹來完成,對線段樹可持久化即可
1 #include2view codeusing
namespace
std;
3#define n 500005
4#define mid (l+r>>1)
5int b,v,n,p,x,y,r[n],ans[n],f[n*30],ls[n*30],rs[n*30];6
int copy(int
k)12
void build(int &k,int l,int
r)18
build(ls[k],l,mid);
19 build(rs[k],mid+1
,r);
20 f[k]=max(f[ls[k]],f[rs[k]]);21}
22void update(int &k,int l,int r,int x,int
y)28
if (x<=mid)update(ls[k],l,mid,x,y);
29else update(rs[k],mid+1
,r,x,y);
30 f[k]=max(f[ls[k]],f[rs[k]]);31}
32int query(int k,int l,int r,int
x)37
intmain()49}
50 }
LOJ 持久化序列 可持久化treap
一道模板題 在寫完這道題以後就去找其他帶翻轉的可持久化treap題去寫了 發現自己根本不會可持久化treap 什麼標記翻轉可持久化 自閉了一整天 網上也沒有找到很好的模板 於是選擇擱置一段時間 等以後時間充裕了再來磕 includeusing namespace std const int maxn...
可持久化Treap
本來是想寫一點題的,但是hfu最近讓我改鍵盤指法,原來都是亂打 手速蠻快就是錯的多 剛開始練手法真的煩躁,像我這種從來不用小指頭的 就寫個學習筆記吧.非教程向,只是懂了後寫點隨筆,練成指法說不定能來填坑.可持久化treap首先是基於非旋轉式treap的,如果要旋轉的話那麼就會破壞父子關係導致無法可持...
可持久化Treap
可持久化treap本質上市乙個二叉平衡樹,若不對其規則進行修改,中序遍歷後得出的序列是遞增的。void maintain o 計算結點o的size int lowcount key 比key所在位置小1 int uppercount key key所在的位置,如果有多個相同的key,選位置最大的 i...