線段樹套Treap

2021-07-11 09:03:53 字數 2087 閱讀 8056

題目為bzoj1901.

單點修改區間第k大,如果卡記憶體你要怎麼辦:

hq說線段樹套平衡樹比樹狀陣列套線段樹好得多……

所以我就寫了……

然後就寫了(n ^ log^3n),在zju上t掉了qaq

卡記憶體還卡時間真是有夠過分……

其實就是外層線段樹存一下根然後按照正常的treap寫就好了,但是有乙個問題就是treap的刪點……這個東西不要寫掛就好了……

#include 

#include

#include

#include

#include

#include

#define rep(i,n) for(int i = 1; i <= n ; i ++)

#define repg(i,x) for(int i = head[x] ;~ i ; i = edge[i].next)

#define rep_0(i,n) for(int i = 0 ; i < n ; i ++)

#define rd(i,x,n) for(int i = x; i <= n ; i ++)

#define clr(a,b) memset(a,b,sizeof(a))

#define u t[x]

#define o t[y]

#define lc ch[0]

#define rc ch[1]

#define tc ch[ty]

#define vc ch[!ty]

#define ulfc t[u.lc]

#define urtc t[u.rc]

using namespace std;

const

int inf = (int)1e+9;

typedef long

long ll;

int read()

const

int n = 50005;

int n,m,a[n],tot;

struct treap}t[n * 16];

void upd(int x)

void rot(int &x,bool ty)

void ins(int &x,int val)

if(val == u.val)

bool ty = val > u.val;

ins(u.tc,val);

t[u.tc].fix > u.fix ? rot(x,ty) : upd(x);

}void del(int &x,int val)

rot(x,ty),del(u.vc,val);

}else u.cnt --;

}else del(u.ch[val > u.val],val);

upd(x);

}int getrank(int x,int w)

#define rt 1,1,n

#define lson x << 1,l,mid

#define rson x << 1 | 1,mid + 1,r

int sg[n << 2];

void build(int x,int l,int r)

void segc(int x,int l,int r,int pos,int s,int val)

void change(int pos,int s)

int calc(int x,int l,int r,int ql,int qr,int w)

int mid = l + r >> 1,ranking = 0;

if(ql <= mid)ranking += calc(lson,ql,qr,w);

if(mid < qr)ranking += calc(rson,ql,qr,w);

return ranking;

}int main ()

else

printf("%d\n",l == inf ? -1 : l);}}

return

0;}

在刪除時,如果在if之前減掉的話,就會掛掉,因為你要遞迴下去刪這個節點,這樣的話cnt就不是0了,然後就掛掉了。

其實好像挺簡單的……

初學樹套樹 線段樹套Treap

樹套樹是乙個十分神奇的演算法,種類也有很多 像什麼樹狀陣列套主席樹 樹狀陣列套值域線段樹 zkw 線段樹套 vector 等等。不過,像我這麼弱,當然只會最經典的線段樹套 treap 啦。線段樹我相信大家都會的,treap 可以看一下這篇部落格 簡析平衡樹 二 treap 線段樹套 treap 的思...

Zoj 2112 線段樹套Treap

樹套樹入門題 樹套樹空間複雜度分析 維護乙個長度為n的序列,線段樹的結點數一般為4n,而treap則是對於每乙個元素 包括重複出現的 都需要乙個空間,那麼第1層的所需要的空間為 1 n 第二層為 2 n 2 所以其實為o h n.那麼所需的空間為o nlog n 但在實際運用中,所形成的線段樹往往不...

BZOJ2141 排隊(線段樹套Treap)

點此看題面 大致題意 給你乙個序列,每次交換兩個數,求每次操作後的逆序對個數。推薦先去看一下這道題目 洛谷3759 tjoi2017 不勤勞的圖書管理員 貌似是此題的公升級版 推薦先去學一學線段樹套 treap 當然你也可以學習 hl666 奆佬分塊狂踩樹套樹 做了上面給出的那道題目,這道題目就是一...