前置知識:普通平衡樹。
實際上,平衡樹能做到的操作不只有插入刪除,查排名查值,前驅後繼這些。
如果我們把平衡樹移到區間上,我們甚至能夠支援比線段樹更強的操作——區間翻轉。
這就是文藝平衡樹這道題了。
首先我們來明確一下區間樹的概念。
顧名思義,區間樹就是用來維護區間的。
具體地,我們規定平衡樹的中序遍歷得到的數列就是我們所維護的陣列。
比如下面這一棵樹:
中序遍歷得 \(1\ 3\ 5\ 4\),也就是說這棵平衡樹就維護了 \(1\ 3\ 5\ 4\) 這個陣列。
需要注意的是,這裡我們的平衡樹只是用來維護數列的乙個結構;可以看到,數列中的數本身是並不符合 bst 特性的。
或者說,滿足 bst 特性的是陣列下標,而不是陣列中的值。
文藝平衡樹
和splay差不多,就是維護區間,把siz值為l 1 1與r 1 1的兩個節點,將乙個旋轉到根,另乙個旋轉到根的右兒子上,則要修改的區間就是根的右孩子的左子樹,直接打標記即可。推薦 遠航之曲dalao writer hsz wjmzbmr tourist hzwer include include ...
模板 文藝平衡樹
由於中序遍歷不會因為旋轉改變,平衡樹可以作為區間樹使用。翻轉用打標記的方法,splay x,y 代表把x接到以y為根的子樹下面。include include using namespace std const int maxn 100005 int n,m int val maxn siz max...
模板 文藝平衡樹
點此看題 最近學了無旋treap text treap 那就用它來水一發吧。反轉區間我們不考慮權值,一開始直接用merge text merge 插入,修改時直接split text split 出三個區間 1,l 1 l,r r 1,n 1,l 1 l,r r 1,n 1,l 1 l r r 1 ...