1. 程式人生 > >啟發式合併&線段樹合併&treap合併&splay合併

啟發式合併&線段樹合併&treap合併&splay合併

啟發式合併

  有n個集合,每次讓你合併兩個集合,或詢問一個集合中是否存在某個元素。

​  我們可以用平衡樹/set維護集合。

​  對於合併兩個A,B,如果|A|<|B|,那麼我們就把A中的每個元素暴力加到B中,否則就把B中的元素暴力加到A中。

​  對於一次把A中的每個元素暴力加到B中的操作,|A|會變成|A|+|B|,也就是說大小至少會翻倍,所以一個元素最多被暴力插入logn次。每次插入的時間複雜度是O(logn),所以總的時間複雜度是O(nlog2n)

線段樹合併

​  如果兩棵線段樹有一顆為空,就直接返回另一棵。

​  否則把x的左兒子和y的左兒子合併在一起,作為x

的左兒子,然後把x的右兒子和y的右兒子合併在一起,作為x的右兒子。

​  設值域為[1,m],總的點數為n

  好像要mn同階

​  對於線段樹上一個區間,這個區間內所有點的值和為s,那麼全部合併結束後這個區間最多被經過O(s)次,所以時間複雜度是O(s)=O(nlogn)

treap合併

​  對於兩個點x,y,把優先順序較小的那個點(假設是x)作為根,然後把另外一棵樹y按照vx剖開,兩邊遞迴下去合併。

​  時間複雜度不會證,反正把大小為n,m(nm)的兩棵treap合併是O(nlogmn)的。所以總的時間複雜度是O(nlogn)的。

  論文在資源收集那篇部落格裡面有。

splay合併

  聽說是把小的那棵splay按中序遍歷插到大的那棵splay裡面。

  聽說時間複雜度是O(nlogn)的。

  好像和Dynamic Finger Theorem有關

相關推薦

啟發式合併&線段合併&treap合併&splay合併

啟發式合併   有n個集合,每次讓你合併兩個集合,或詢問一個集合中是否存在某個元素。 ​  我們可以用平衡樹/set維護集合。 ​  對於合併兩個A,B,如果|A|<|B|,那麼我們就把A中的每個元素暴力加到B中,否則就把B中的元素暴力加到A中。

jzoj5926 naive 的圖 最小生成樹+啟發式合併+線段合併

Description 眾所周知,小 naive 有一張 n 個點,m 條邊的帶權無向圖。第 i 個點的顏色為 ci。d(s, t)表示從點 s 到點 t 的權值最小的路徑的權值,一條路徑的權值定義為路徑上權值最大的邊的權值。 求所有滿足 u < v, |cu − cv|

poj 3667 NYOJ 534 hotel (區間合併線段

區間合併的線段樹題,也是我的第一個區間合併。 題意(轉):Bessie等牛到加拿大的桑德貝去增長文化修養外帶觀賞蘇必利爾湖的陽光。按照導遊的介紹,Bessie選擇了著名的Cumberland大街上的Bullmoose賓館作為居住的地點。 這座巨型賓館在一條超長走廊上有N(1 ≤ N ≤ 50000)個排成

HDU 5649 DZY Loves Sorting(二分答案+線段線段合併+線段分割)

題意 一個 \(1\) 到 \(n\) 的全排列,\(m\) 種操作,每次將一段區間 \([l,r]\) 按升序或降序排列,求 \(m\) 次操作後的第 \(k\) 位。 \(1 \leq n \leq 10^5\) 思路 兩個 \(\log\) 的做法展現了二分答案的強大功能。首先二分列舉第 \(k

BZOJ4552 HEOI2016/TJOI2016排序(線段合併+線段分裂)

  很久以前寫過二分答案離線的做法,比較好理解。事實上這還是一個線段樹合併+分裂的板子題,相比離線做法以更優的複雜度做了更多的事情。具體不說了。怎麼交了一遍luogu上就跑第一了啊 #include<iostream> #include<cstdio> #include<

poj 3667 Hotel(線段,成段更新,區間合併,Lazy思想)

題意: 有n個連續的房間,m個操作,共有兩種: 1 num 詢問是不是有連續長度為num的空房間,若有,輸出連續房間的最左邊端點。 2 st num 將 [st,st+num-1]的房間清空。 本來想自己敲出這道題,敲到查詢的時候沒有思路,最後看解題報告,然後自己敲,一

初學線段Treap

前言 樹套樹是一個十分神奇的演算法,種類也有很多:像什麼樹狀陣列套主席樹、樹狀陣列套值域線段樹、zkwzkwzkw線段樹套vectorvectorvector等等。 不過,像我這麼弱,當然只會最經典的 線段樹套TreapTreapTreap 啦。 LinkLi

bzoj 3196 && luogu 3380 JoyOI 1730 二逼平衡 (線段Treap

put clas 結構 online input 維護 amp bbs 查詢 鏈接:https://www.lydsy.com/JudgeOnline/problem.php?id=3196 題面; 3196: Tyvj 1730 二逼平衡樹 Time Limit

BZOJ4919 大根堆(動態規劃+線段合併/treap+啟發式合併

  一個顯然的dp是設f[i][j]為i子樹內權值<=j時的答案,則f[i][j]=Σf[son][j],f[i][a[i]~n]++。這樣是可以線段樹合併的,將各兒子加起來然後打上加法標記即可。需要標記永久化。   另一種做法是考慮擴充套件經典的單調佇列優化LIS的做法,維護子樹內答案為k時最小的最

hdu 6191 可持久化trie||線段套trie||trie啟發式合併

題意:一個樹,q次詢問,求xi xor u的子樹的max值 思路:考慮可以直接dfs,對映到數軸上,然後就是裸的可持久化trie了。。時間複雜度nlogn,同理nlognlogn可以線段樹套trie(這個題沒按這個寫。。應該可以?參考51nod1295,第一次寫可持久化trie就是樹套樹水過

啟發式合併線段,平衡

【啟發式合併】線段樹,平衡樹 啟發式合併就是一種複雜度可以證明的貪心合併 平衡樹啟發式合併: 對於平衡樹的啟發式合併,我們將一個 $size$ 較小平衡樹一個一個結點暴力加入 $size$ 較大的平衡樹中 最壞時間複雜度是玄學的 $O(N log^{2} N)$ 空間複雜度 $O(N)$ 模板題:

BZOJ 2212 線段啟發式合併

簡略題意:現在有一棵二叉樹,所有非葉子節點都有兩個孩子。在每個葉子節點上有一個權值(有n個葉子節點,滿足這些權值為1..n的一個排列)。可以任意交換每個非葉子節點的左右孩子。要求進行一系列交換,使得最終所有葉子節點的權值按照遍歷序寫出來,逆序對個數最少。 考慮

bzoj 3123: [Sdoi2013]森林 啟發式合併+可持久化線段

題意:給出一片森林,每個點有點權,要求資瓷兩個操作:詢問兩點間路徑的第k小點權;加一條邊 分析:如果沒有合併操作的話就是裸的可持久化線段樹啦。 但既然有合併操作那麼我們就每次把兩個塊的可持久化線段樹進行啟發式合併。 何為啟發式合併呢,其實就是暴力合併,把小一點的那棵樹上的

【樓天城男人八題】【分治|Treap+啟發式合併】POJ1741 Tree

題面在這裡 待我先膜拜一下樓教主…… 首先這題是很明顯的樹分治 想說點什麼卻發現已經沒什麼好說了 然後我們來看另一種解法:平衡樹亂搞 這裡用的是Treap實現 對於每個節點,用Treap記錄該子樹每個節點到根(預設為1)的距離 那麼如何統計答案

CSU 1811 Tree Intersection(線段+啟發式合併 解法)

Problem Reference Meaning 一棵 n 個結點的樹,每個結點都有一種顏色,問對與樹上的每條邊,刪掉它之後得到的兩棵樹中,共有的顏色有多少種(在那兩棵樹中都有的顏色就是公有的顏色) Analysis 首先規定 1 號結點為整棵樹的根(其它號也可

啟發式合並(堆、set、splaytreap)/線段合並學習小記

排序 需要 操作數 所有 class 兩個 因此 ext pan 啟發式合並 剛聽到這個東西的時候,我是相當蒙圈的。特別是“啟發式”這三個字莫名的裝逼,因此之前一直沒有學。 實際上,這個東西就是一個SB貪心。 以堆為例,若我們要合並兩個堆a、b,我們有一種極其簡單的做法:

luogu P4755 Beautiful Pair - 啟發式合併 - 主席

題目大意: 給一個非負整數數列,問有多少子區間,端點權值乘積小於等於區間最大值。 (其實是啟發式分裂? 和這個題做法一模一樣,沒了。 // luogu-judger-enable-o2 #include<bits/stdc++.h> #define gc getchar()

【題解】[牛客網NOIP賽前集訓營-提高組(第一場)]C.保護 LCA+線段動態開點+線段合併

題目連結 ___ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=2e5+10; int n,m,hd[N],to

POI2011]ROT-Tree Rotations,洛谷P35231,線段合併

正題       給一顆n各節點的二叉樹,每個節點可以交換左右子樹,求先序遍歷的最小值。       這題很明顯,交換兩棵子樹,子樹內的逆序對不變的,變的只是左右兩邊出現的逆序對,那麼每一個葉子節點開一棵權值線段樹,每次向上合併

HDU - 1540 Tunnel Warfare 線段區間合併與棧的結合

During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast areas of north China Plain. Generally speaking, vil