[動態開點線段樹][學習筆記]
權值線段樹
所謂權值線段樹,就是指線段樹記憶體的是權值。好像是廢話。給出一些數,要查詢一個區間內的數的個數。這時可以用權值線段樹,開個n(n為給出的數的最大值)個點的線段樹。然後就能輕鬆的維護了當然樹狀陣列更簡單
動態開點
為什麼要動態開點呢?當然是因為空間不夠啊。比如還是上面那個例子。加入給出的數的最大值為\(10^{12}\),並且無法離散化,顯然空間開不下。那麼就需要動態開點了。
思想
動態開點的思想就是,初始線段樹只有一個根。當插入節點的時候在把那些需要的節點開出來。具體方法其實看一下程式碼就明白了。
void update(int &rt,int l,int r,int pos,int c) { if(!rt) { rt = ++num; tree[rt] = c; } tree[rt] = min(tree[rt],c); if(l == r) return; int mid = (l + r) >> 1; if(pos <= mid) update(ls[rt],l,mid,pos,c); else update(rs[rt],mid + 1,r,pos,c); }
這就是插入的程式碼。注意在rt上面是有"&"的。其他的操作就和普通線段樹一樣了。
一道例題
hdu6183
題解
相關推薦
[動態開點線段樹][學習筆記]
權值線段樹 所謂權值線段樹,就是指線段樹記憶體的是權值。好像是廢話。給出一些數,要查詢一個區間內的數的個數。這時可以用權值線段樹,開個n(n為給出的數的最大值)個點的線段樹。然後就能輕鬆的維護了當然樹狀陣列更簡單 動態開點 為什麼要動態開點呢?當然是因為空間不夠啊。比如還是上面那個例子。加入給出的數的最
HDU - 6183 動態開點線段樹 || 令人絕望的線段樹
query 左右 log con span 空間 工作 amp markdown 一看C才[0,50],肯定要開51棵線段樹維護y區間的最小x值啦 是男人就上51棵..等等空間爆幾倍了 動態開點!51棵線段樹用全局節點變量控制,有點像主席樹 清空工作很簡單,把51個樹根清掉
CF1045G AI robots(動態開點線段樹)
map sort solution min 一行 ace 覆蓋 unique b+ 題意 火星上有$N$個機器人排成一行,第$i$個機器人的位置為$x_{i}$,視野為$r_{i}$,智商為$q_{i}$。我們認為第$i$個機器人可以看到的位置是$[x_{i}-r_{i}
【題解】[牛客網NOIP賽前集訓營-提高組(第一場)]C.保護 LCA+線段樹動態開點+線段樹合併
題目連結 ___ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=2e5+10; int n,m,hd[N],to
CodeForces - 915E 動態開點線段樹||離散化線段樹
題意: 給定1-n的一段空區間,每次給出 x y z 的詢問,z == 1 時將 x - y 區間全部填充,否則為空,問最後一共有多少空區間 分析: 很明顯的線段樹題目,不過主要是想學習以下動態開點,不過陣列範圍自己一時間也還不懂怎麼處理。
BZOJ-4777 Switch Grass(最小生成樹+動態開點線段樹+可刪堆)
題意 給定一張 n n n 和節點,
NOIP2017day2 列隊(動態開點線段樹)
題意 https://www.luogu.org/problemnew/show/P3960 思路 30 30
2018.11.07【CQOI2011】【BZOJ3295】【洛谷P3157】動態逆序對(樹狀陣列套動態開點線段樹)
BZOJ傳送門 洛谷傳送門 解析: 首先我們可以通過一個線段樹求出逆序對個數,然後就是亂搞的時間了。 顯然每次刪除一個數,需要我們查詢前面比他大的數的個數和後面比他小的數的個數,這個就是裸的樹套樹了。這道題可以用樹狀陣列套線段樹動態開點。 程式碼: #
「SCOI 2014」方伯伯的 OJ「動態開點線段樹」
題目傳送門 備註:洛谷,2018/9/26,此題題面有誤,見討論。 題解 動態開點線段樹。 線段樹的葉子的結點有個值, v v
Gym - 101630A Archery Tournament (動態開點線段樹)
解題思路:一個X點上的圓的個數不會超過 logN個。所以完全可以線段樹暴力。線段樹動態開點即可。區間新增圓。然後暴力查詢區間裡面的圓是否滿足答案。 #include<iostream> #include<deque> #inc
CodeForces - 1046A AI robots(動態開點線段樹)
A. AI robots time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output In the
動態開點線段樹(多棵線段樹)的記憶體分配與回收
前言 線段樹,是一個很好用的能支援O(logn)區間操作的資料結構,隨著做一些稍微煩一點的題,有時候會發現有些情況要開一個數組的線段樹,更有甚者要樹套樹,而在很多情況下線段樹就不能把所有點都開滿了(否則會MLE記憶體超限),於是就出現了線段樹的動態開點寫法 基本思想 與普通的
2018湖南省程式設計競賽E題 動態開點線段樹
E.Grid 省賽時沒寫出這個題,確實是線段樹水平太菜了,現在又想到了這個題,我靠水題。 思路:這個題說白了就是求最大1 到1e9這個區間有多少個點被覆蓋,普通線段樹空間肯定不行,不過可以用動態開點解決,每次更新最多新花幾十個節點的空間,1e5次更新,最多隻需幾百萬的空間足夠,解決了這
洛谷 P3313 [SDOI2014]旅行 樹鏈剖分+動態開點線段樹
P3313 這個題要根據每個城市信仰的宗教建線段樹,但是這樣的話最多會有1e5個線段樹,所以要動態開點(其實就是主席樹思想),先把樹用重鏈剖分,剖出來每個點有線上段樹上對應的區間,所以線段樹共用這一套區間,問題就簡單了,至於修改城市的宗教,只需把原來宗教那個線段樹的對應區間清0,在修改後宗教
CF915E Physical Education Lessons|動態開點線段樹
physical swa oid else 動態 減少 add 會有 有用 動態開點線段樹 題目暗示了區間修改,所以我們自然想到了用線段樹來維護非工作日的天數。 然而我們再看一下數據範圍,天數n的範圍是\(1 \le n \le 10^9\),像普通線段樹一樣預處理顯然會爆
淺談動態開點線段樹
興致勃勃的弱雞想去學主席樹了! 可惜突然發現動態開點線段樹不會了。。。。 發揮大膽猜想,不用求證的精神:你們都會線段樹 眾所周知:線段樹空間複雜度是O4*n,這就不用證,因為我菜 那當n很大,操作正常時,如果像正常的線段樹一樣(記左兒子為n+n,右兒子為n+n+1),再開四倍n會炸記
[bzoj4999][樹鏈剖分][動態開點線段樹]This Problem Is Too Simple!
Description 給您一顆樹,每個節點有個初始值。 現在支援以下兩種操作: C i x(0<=x<2^31) 表示將i節點的值改為x。 Q i j x(0<=x<2^31) 表示詢問i節點到j節點的路徑上有多少個值為x的節點。
[bzoj1125][動態開點線段樹][雜湊]Poc
Description n列火車,每條有l節車廂。每節車廂有一種顏色(用小寫字母表示)。有m次車廂交換操作。求:對於每列火車,在交換車廂的某個時刻,與其顏色完全相同的火車最多有多少。 Input n l m (2 ≤ n ≤ 1000, 1 ≤ l ≤
2018湖南省程式設計競賽E題 動態開點線段樹
csu還沒好,題目連線暫時沒有,省賽時沒寫出這個題,確實是線段樹水平太菜了,現在又想到了這個題,我靠水題。 思路:這個題說白了就是求最大1 到1e9這個區間有多少個點被覆蓋,普通線段樹空間肯定不行,不過可以用動態開點解決,每次更新最多新花幾十個節點的空間,1e5次更新,最多
|BZOJ 3531|樹鏈剖分|動態開點線段樹|[Sdoi2014]旅行
樹剖以後每個宗教建立一棵線段樹,節點太多用傳統方法開陣列肯定不行,這裡進行改進,使用了動態開點線段樹,即需要這個點再開這個點。 #include<cstdio> #include<cstring> #include<alg