當我們想要做RMQ(區間極值)時
我們會使用sparse table, 線段樹...
但其實有另一個做法,稱作分塊
7 | 1 | 2 | 4 | 6 | 3 | 8 | 9 | 5 |
---|
7 | 6 | 9 |
---|
每K格記錄答案
7 | 1 | 2 | 4 | 6 | 3 | 8 | 9 | 5 |
---|
7 | 6 | 9 |
---|
若有覆蓋到整塊->直接查
沒被蓋到的最多2K->暴力做
7 | 1 | 2 | 4 | 0 | 3 | 8 | 9 | 5 |
---|
7 | 4 | 9 |
---|
只會影響到那塊
就暴力跑完,維護好答案
詢問: O(N/K+K)
修改: O(K)
根據算幾不等式,K+(N/K)≥2K×(N/K)
等號成立條件: K=N/K
所以當K=N時,複雜度最好
以前提到的BIT、線段樹複雜度都是O(logN)
比分塊更好,那分塊有什麼用?
中國人插隊問題
有 N 筆操作
1 x id: 編號為 id 的人插隊到第 x 個位置
2 x: 排在第 x 個位置的人走了
3 x: 詢問排在第 x 個位置的人的編號
給定一張圖,N個點M條邊
對於三個點 a, b, c (a<b<c),若a,b和b,c和c,a之間都有邊
則 a, b, c 形成一個三角形。
請問整張圖總共有多少三角形?
N, M≤105
假設我們可以O(1)回答(x,y)之間是否有一條邊
那麼對於圖上任意一點 v,可以
對於點度 <K 的點,我們花 O(∑di2) 時間做
O(∑di2)=O(K×∑di)=O(K×M)
剩下的點花 O(M×C) 的時間做
定義 C 為點度 ≥K 的點數數量
可以得知,C≤2M/K
總複雜度: O(K×M+M2/K)
取 K=M 時有最好複雜度 O(MM)
給一個長度為 5×105 的序列(初始為全零),有 Q 筆操作
1 x y : 將第 x 個數字加上 y
2 x y : 求序列中所有編號除以 x 餘 y 的數字和
Q≤5×105
給定數字 N,求 ∑i=1NN mod i
N≤1013
有 N 個人,每 x 個人一組,從 1 號開始依序分。定義 f(i) 為考慮 x=1,x=2,...,x=N 這 N 種情況時,編號 i 的人分不到組的狀況總數
給定 L,R,求f(L),f(L+1),...,f(R)
1≤N≤240,R−L≤3×105