題意
給定一個序列,表示 \(n\) 個人每個人給 \(a_i\) 投了一票。
每次操作給定序列 \([l, r]\),求 \([l, r]\) 的眾數。
若 \([l, r]\) 沒有絕對眾數則令該區間的眾數為 \(p\),並將隨後給定的 \(k\) 個整數,\(a_{s_1}, a_{s_2}, ... a_{s_k}\) 改為 \(p\)。
Sol
摩爾投票。
一句話總結,就是設二元組 \((x, y)\),表示當前數為 \(x\),權值為 \(y\)。
若合併兩個二元組 \((x_1, y_1), (x_2, y_2)\) 取 \(y\) 較大的 \(x\),\(y\) 相減,若 \(x\) 相同,則 \(y\) 相加。
這個玩意顯然是滿足結合律的。
考慮使用線段樹維護這個東西。
但是有個問題,摩爾投票保證若 區間有眾數 則留下的一定是眾數,若區間沒有眾數,求出來的不一定是眾數。
可以考慮用一顆平衡樹判斷每一次操作的是否是區間的眾數。
複雜度:\(O(n \log n)\)