核心函式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 模板 普...