splay 學習筆記

2021-10-21 05:51:27 字數 2122 閱讀 7611

核心函式splay:每次訪問乙個節點,都把該節點轉到根 (包括插入/查詢/操作)

思想:對於訪問頻率較高的節點,使其處於根節點附近,從而保證log複雜度

splay可以維護中序遍歷是有序序列

也可維護 中序遍歷是當前操作後的序列

const

int n=

1e5+10;

struct nodet[n]

;int root,idx;

int n;

void

pushup

(int x)

void

pushdown

(int x)

}int

getlr

(int x)

//判斷x是fa的左/右兒子 0/1

void

rotate

(int x)

void

splay

(int x,

int k)

rotate

(x);}if

(k==

0) root=x;//}

intinsert

(int

&x,int fa,

int val)

;splay

(x,0);

return x;

//idx}if

(val.v)return

insert

(t[x]

.s[0

], x, val)

;else

return

insert

(t[x]

.s[1

], x, val);}

intinsert

(int v)

;splay

(x,0);

//return x;

}/*int getval(int x,int rk) //x

else return getval(t[x].s[1], rk-t[t[x].s[0]].sz-1);

}*/int

getk

(int rk)

else rk-

= t[t[x]

.s[0]]

.sz+

1, x=t[x]

.s[1];

}return-1

;}/* int getpre(int x, int val)*/

intgetnex

(int x,

int val)

else

}else

return

getnex

(t[x]

.s[1

], val);}

intgetnex

(int val)

splay

(res,0)

;//

return res;

}void

remove

(int l,

int r)

void

rever

(int l,

int r)

void

build()

void

output

(int x)

intwork()

// if(op[0]=='i')

else

if(op[0]

=='a'

) delta+

=k;else

if(op[0]

=='s'

)else

if(op[0]

=='f'

)// else printf("%d\n",getval(root, sz-k+1 +1) +delta); }}

printf

("%d\n"

,tot-

(t[root]

.sz-2)

);/* int q; cin>>n>>q;

build();

fu(i,1,n) insert(i);//val

while(q--)

output(root);

*/return0;

}

Splay學習筆記

一種二叉樹的樹形資料結構,其定義如下 一種自平衡二叉搜尋樹,通過不斷將某個節點旋轉到根節點,使得整棵樹仍然滿足二叉查詢樹的性質,且保持平衡而不至於退化為鏈 root tot fa i child i 0 1 val i cnt i size i 根節點節點總數 父親左右兒子 點權出現次數 子樹大小 ...

Splay學習筆記

n n 500000 個數,要求維護區間加,區間查詢 很簡單,用線段樹 樹狀陣列隨便寫寫就能過 n n 500000 個數,維護插入 刪除 找區間第k大 小 用平衡樹 set也能過 n n 500000 個數,維護區間翻轉,區間查詢,插入,刪除 這個時候就需要用到伸展樹 splay splay是一種...

學習筆記 splay入門(更新中)

宣告 本部落格所有隨筆都參照了網路資料或其他部落格,僅為博主想加深理解而寫,如有疑問歡迎與博主討論 終於學習了 spaly splay 聽說了很久,因為dalao總是那這個開玩笑所以對它有深深的恐懼.但是學起來沒有那麼難啦,可能是因為提前學了替罪羊樹?學替罪羊樹真的是痛苦555 p3369 模板 普...