分塊:數組
prob1:長度爲n的數列,n次操做,單點插入,單點/區間查詢(假設須要維護的信息能夠O(1)維護)優化
sulution:分塊,sqrt(n)次操做後重構,重構O(n),總複雜度O(nlogn)io
other_solu:用splay維護便可,O(nlogn),常數大,複雜度容許的話寫上面那個重構
prob2:長度爲n的數列,n次操做,每次操做是(l, r, c),詢問區間中等於c的有多少個,並將區間都改成c查詢
solution:分塊,每塊維護一個有序數組和覆蓋的lazy標記便可,查詢時當前塊有標記則O(1)獲得答案,不然O(logn)獲得,總複雜度是O(n*sqrt(n)*logn)co
實際上咱們只維護每一個塊是不是同一個數字,是則O(1)回答,不然暴力查詢。若塊大小爲k,則修改成O(k + n / k),查詢爲O(n)數字
但實際上一次操做最多使兩個塊,由同一個數字的狀態變爲非同一個數字的狀態,因此修改的均攤複雜度是O(n / k)的play
k取根號,總複雜度O(n^1.5)
prob3:長度爲n的數列,n次詢問,問區間衆數
solu1(離線):莫隊+set,O(n*sqrt(n)*logn)
solu2(在線):參見clj論文(區間衆數解題報告)第一種作法,複雜度同上
solu3(在線):clj論文的無修改優化作法,O(n^1.5)
solu4(離線):莫隊有個O(n^1.5)的作法,額外維護當前區間出現次數爲i的數字有多少個便可,這作法有空間優點,O(n)的空間
可以維護衆數出現次數,但沒法維護衆數是哪一個數
prob4:帶修改區間衆數
solution(在線):參見clj論文,O(n^(5/3))
prob5:查詢區間出現正偶數次/正奇數次的數字個數
solu:至關於count在模2意義下的衆數