<style>
body{
background-attachment: fixed;
background-repeat: no-repeat;
background: -webkit-linear-gradient(left, #ffffff,rgba(51,51,51,0.3)), url("https://i.imgur.com/SyxOqpN.jpg") center no-repeat fixed;
};
</style>
<!-- .slide: data-background="https://i.imgur.com/SyxOqpN.jpg" -->
<font color="black">
<font size=15><b> 那些可愛的根號算法>w< </b></font>
<font size=14><b> 作者: iceylemon </b></font>
----
<font color="black">
<font size=8><b> 根號算法 </b></font>
1. 找質數/因數
2. 數論分塊
3. 大小分塊
4. 序列分塊
5. 詢問分塊(定期重構)
6. 莫隊算法
7. 其他怪怪的東西
</font>
---
<font color="black">
<font size=8><b> 大小分塊 </b></font>
小於 $\sqrt{N}$ 一個做法,大於 $\sqrt{N}$ 另一個做法
</font>
----
<font color="black">
<font size=8><b> 分析 </b></font>
* 小於 $\sqrt{N}$:通常是暴力
* 大於 $\sqrt{N}$:因為大於的數會有$O(N)$個,所以轉移或操作的複雜度平均要是$O(\sqrt{N})$以下。通常圍繞著$\sqrt{N}$跑。
</font>
----
<font color="black">
<font size=8><b> 例題 </b></font>
題目:非常多,到處都是
1. ABC 219G
2. LOJ 6089
</font>
---
<font color="black">
<font size=8><b> 序列分塊 </b></font>
俗稱優雅的暴力,把一個序列分成若干塊處理
</font>
----
<font color="black">
<font size=8><b> 例題 </b></font>
給定一個陣列$A$,支援以下操作:
1. 區間加值
2. 區間查詢
</font>
----
<font color="black">
<font size=8><b> 分塊先備條件 </b></font>
1. **大段維護,局部暴力**
2. 局部暴力通常不成問題難在如何維護整塊的資訊
3. 除了維護單一塊內資訊,如何合併答案也很重要
</font>
----
<font color="black">
<font size=8><b> 慣用手法 </b></font>
1. 首先先把陣列分成若干塊,每塊大小為 $B$,不足的就讓它不足
2. (可選) 標記每一個位置是屬於哪一塊,通常 0-base 我們會使用 $\frac{i}{B}$ 來作為塊編號(向下取整)
3. 對於一個區間 $[L,R]$,最多會包含到兩個不完整的塊(左右),局部處理這兩塊,剩下的用打tag的方式維護
4. 處理答案的合併
</font>
----
<font color="black">
<font size=8><b> 例題講解 </b></font>
1. 區間修改:不完整的塊一個一個修改,完整的塊打一個tag: 塊內元素*val
2. 區間查詢:同上,修改改成相加即可
</font>
----
<font color="black">
<font size=8><b> 複雜度 </b></font>
1. 不完整的塊一個一個修改:$O(2B)=O(B)$
2. 完整的塊打一個tag: $O(N/B)$
總複雜度:$O(Q(B+N/B))$,由算幾不等式可知取 $B=\sqrt{N}$最優,整體複雜度$O(Q\sqrt N)$
</font>
----
<font color="black">
<font size=8><b> 分塊可以做什麼 </b></font>
* 很多的區間問題,只要可以打tag維護通常都可
* 可以在塊內做二分搜,甚至可以塞資料結構
* 複雜度通常不好分析,但理論上他是好的
* 分塊本人就是一個**資料結構**,資料結構可以做的他都可以做 ex: DP 優化
</font>
----
<font color="black">
<font size=8><b> 值域分塊 </b></font>
值域分塊是一種資料結構
</font>
----
<font color="black">
<font size=8><b> 值域分塊 </b></font>
值域分塊是一種資料結構
跟值域線段樹很像,就是對值域進行分塊
每塊分別統整該塊的答案
</font>
----
<font color="black">
<font size=8><b> 題目? </b></font>
他不太常出現,因為值域線段樹可以蓋掉大部分的CASE
但值域分塊還是有一些好用的地方:單點修很快
有些題目用是要用值域分塊才可以過的
</font>
----
<font color="black">
<font size=8><b> 回家作業 </b></font>
1. hzwer 的分塊 9 講
LOJ 6277~6285
</font>
---
<font color="black">
<font size=8><b> 詢問分塊 </b></font>
又叫定期重構。適用於有修改也有查詢的題目。顧名思義將詢問進行分塊,當處理完整個塊所有的詢問時,將你的陣列一次加上那些修改操作。在塊內時暴力查詢不修改。
</font>
----
<font color="black">
<font size=8><b> 詢問分塊 </b></font>
又叫定期重構。適用於有修改也有查詢的題目。顧名思義將詢問進行分塊,當處理完整個塊所有的詢問時,將你的陣列一次加上那些修改操作。在塊內時暴力查詢不修改。
**所以什麼是詢問分塊?**
</font>
----
<font color="black">
<font size=8><b> 例題 </b></font>
給定一個陣列$A$,支援以下操作:
1. 區間加值
2. 區間查詢
</font>
----
<font color="black">
<font size=8><b> 例題講解 </b></font>
1. 每出現 $\sqrt{Q}$ 次修改操作就把 $A$ 加上那些修改重新算一遍。
2. 每次詢問最多只會有 $\sqrt{Q}$ 的未處理修改,直接暴力計算那些修改對該詢問的影響。
複雜度:$O(N\sqrt{Q})$
</font>
----
<font color="black">
<font size=8><b> 回家作業 </b></font>
[[MDCPP B053]](http://mdcpp.mingdao.edu.tw/problem/B053) 大電神說都沒人解他很難過QQ
</font>
---
<font color="black">
<font size=8><b> 莫隊算法 </b></font>
莫隊算法是一個離線算法,可以處理一個range的區間問題。
</font>
----
<font color="black">
<font size=8><b> 品種 </b></font>
* 普通莫隊算法
* 帶修改莫隊
* 回滾莫隊
* 樹上莫隊
* 莫隊搭配bitset(?)
</font>
----
<font color="black">
<font size=8><b> 使用時機 </b></font>
可以離線做
當你有區間 $[L,R]$ 的答案時,可以快速算出區間 $[L,R-1],[L,R+1],[L-1,R],[L+1,R]$ 的答案
</font>
----
<font color="black">
<font size=8><b> 莫隊算法使用 </b></font>
1. 把序列分塊,塊大小 $B$
2. 把詢問區間按照以下規則排序:左界按**所在的塊編號**排序,右界按**自己的編號**排序。
3. 用兩個指針l,r每次一格一格移動指針到下一個詢問(先移右指針再移左指針),過程中同時維護答案
</font>
----
## 偽Py代碼
```python=
sort(Q) # 左界塊編號排序,右界自身編號排序
ans = 0
def add(x): # 把位置x加進去答案
def sub(x): # 把位置x從答案扣掉
l, r = 1, 0
for [L,R] in Q:
while r < R: add(++ r)
while r > R: sub(r --)
while l > L: add(-- l)
while l < L: sub(l ++)
print(ans)
```
----
<font color="black">
<font size=8><b> 複雜度分析 </b></font>
1. 排序 $O(NlogN)$
2. 當左界都在同一塊右界只會一直往右邊嚕。所以右界移動的格子數不超過 $O(N)$,而這種Case最多只會有 $O(N/B)$ 種=>$O(\frac{N^2}{B})$
3. 左界都在同一塊內移動,所以一次最多移$O(B)$個位置,總共最多移$O(Q)$次整體複雜度$O(QB)$
4. $O(NlogN+\frac{N^2}{B}+QB)$ 取$B=\frac{N}{\sqrt{Q}}$
</font>
----
<font color="black">
<font size=8><b> 題目 </b></font>
1. [區間眾數](https://zerojudge.tw/ShowProblem?problemid=b417)
2. [區間MEX](https://www.luogu.com.cn/problem/P4137) $O(N\sqrt{N})$ Hint: 6I6r6ZqKKyAi5YC85Z+f5YiG5aGKIiDntq3orbfmlbTloYros4foqIo= 請用base64解碼 [解碼器](http://www.mxcz.net/tools/zh-TW/base64.aspx)
3. [非常多題目](https://www.luogu.com.cn/training/2914)
----
<font color="black">
<font size=8><b> 帶修改莫隊 </b></font>
可以帶修改的莫隊,我不會。大概是把**時間**這維加進去一起排序,然後做一些壞壞的事情。
時間複雜度:$O(N^{5/3})$,coding 複雜度:O(玄學)
</font>
----
<font color="black">
<font size=8><b> 回滾莫隊 </b></font>
可以回滾的莫隊。
</font>
----
<font color="black">
<font size=8><b> 回滾莫隊 </b></font>
可以回滾的莫隊。
當你發現你只會作加法(減法)的時候就可以考慮
</font>
----
<font color="black">
<font size=8><b> 回滾莫隊 </b></font>
可以回滾的莫隊。
當你發現你只會作加法(減法)的時候就可以考慮
所以回滾是什麼?
</font>
----
<font color="black">
<font size=8><b> 名詞解釋 </b></font>
* 加法:把某些東西加進答案
* 減法:把某些東西從答案扣掉
* 回滾:英文叫做 rollback,就是回到之前的某一個狀態
</font>
----
<font color="black">
<font size=8><b> 作法 </b></font>
1. 一樣先做莫隊,用下面的方法改一下
2. 右界:如果左界在同一塊的話右界會遞增,所以右界只會有加法
3. 左界:因為左界永遠都在同一塊,所以不妨每一次都暴力算那一塊的答案,算完之後直接退回就好
</font>
----
<font color="black">
<font size=8><b> 題目 </b></font>
1. [區間MAX](https://zerojudge.tw/ShowProblem?problemid=d539)
2. CF EDU DSU PART3 P2
3. [區間MEX](https://www.luogu.com.cn/problem/P4137)
4. [JOISC 2014 D1 某一題](https://loj.ac/p/2874)
</font>
----
<font color="black">
<font size=8><b> 樹上莫隊 </b></font>
在樹上做莫隊。但你要先會樹上分塊,請左轉選訓大電神。
</font>
----
<font color="black">
<font size=8><b> 假樹上莫隊 </b></font>
把樹壓平之後就變成序列問題了,直接莫隊
</font>
----
<font color="black">
<font size=8><b> 莫隊+bitset(?) </b></font>
在做莫隊的時候轉移有時候可以套資料結構,就用bitset當資料結構就好了
</font>
----
<font color="black">
<font size=8><b> 莫隊+bitset(?) </b></font>
在做莫隊的時候轉移有時候可以套資料結構,就用bitset當資料結構就好了
我也沒打過,請右轉OI WIKI
</font>
---
<font color="black">
<font size=8><b> 其他怪怪的東西 </b></font>
根號可以出現在很多地方,偶爾就會在神奇的地方出現
1. YTP2021 pre 第8題可以暴力做(做過的詢問要記起來),複雜度會是根號級別
2. NPSC 2019 國中組初賽 pB 是一個跟上一題一樣的題目。可以用大小分塊證明,詳見[2019資芽講義](https://www.csie.ntu.edu.tw/~sprout/algo2019/ppt_pdf/week10/root_method.pdf)
3. $K=\frac{N*(N + 1)}{2}$,$O(N)=O(\sqrt{k})$
4. 若干個數相加為 $N$ => 最多只有 $\sqrt{N}$ 個相異數(轉有限背包問題)
</font>
----
{"metaMigratedAt":"2023-06-16T11:21:23.336Z","metaMigratedFrom":"YAML","title":"那些可愛的根號算法>w<","breaks":false,"image":"https://i.imgur.com/SyxOqpN.jpg","slideOptions":"{\"theme\":\"solarized\",\"transition\":\"slide\"}","contributors":"[{\"id\":\"6dbe4f9c-da94-469c-86ea-9dd3cabdefdc\",\"add\":7639,\"del\":856}]"}