tag & difficulty
sol難度純粹個人評價。
tag & difficulty
tag: observation | difficulty: 2400
solcodeplus 和 hdu 多校都出現過的原題 /fn 但是線性做法其實還是有點水平的。
先列舉絕對眾數是誰,把非絕對眾數改成 -1,絕對眾數改成 1,那麼需要計算的就是和大於 0 的區間數量。這容易通過字首和然後掃一遍做到單次 \(o(n)\) 總複雜度 \(o(n^2)\),但不能接受。
注意到當元素個數很小的時候,字首和構成的折線傾向於一直往下走,只在其中很少的有當前這個數的一部分有一段小波動。考慮利用這個性質進行優化。
不放假設當前掃到第 \(i\) 個元素,字首和陣列是 \(s\),\(0 \sim i\) 的字首和最小值是 \(min\)。如果 \(s_ = min - 1\),那麼 \(i+1\) 為右端點一定沒有貢獻,且緊跟在它後面的所有 \(-1\) 都一定沒有貢獻。這個時候可以直接不斷往後找找到第乙個 \(+1\) 的位置從那裡開始算貢獻。而 \(s_ \neq min + 1\) 時直接暴力計算貢獻。假設這一部分可以做到單次 \(o(1)\)。考慮它的複雜度。假設 \(s_i = min, s_ \neq min+1\),且 \(j\) 是最靠前的位置滿足 \(s_j = min+1\),如果不存在則設它是 \(n+1\)。則 \(i \sim j-1\) 裡面至少有 \(\frac\) 個 +1,所以這中間暴力掃的複雜度均攤到每個 +1 上就是 \(o(+1\)元素個數\()\) 的,所有的合起來就是 \(o(n)\) 的。
維護上有乙個稍微複雜的地方就是如何維護這個字首和。乙個暴力方法是維護乙個桶表示每個數的出現次數然後每次加減 1 的時候用乙個指標在桶上移動維護增量。直接將這個演算法移植到上面這個 idea 上有乙個問題:\(s_ = min - 1\) 的時候後面的一段 -1 需要在桶上打一片標記。這可以用乙個字首和來解決,也可以直接不在桶裡維護 \(0 \sim min\) 的第一次 +1,也就是說桶裡的所有元素實際上是真實值減 1,這樣一段 1 的移動就不會對桶產生影響了。這樣就做到了真正的 \(o(n)\)。
tag & difficulty
tag: counting | difficulty: 2000
sol容斥,列舉給出的 $m$ 條路徑的乙個子集強制它們全部同色,用並查集合並一下同色的邊集,不同的邊集之間沒有限制所以方案數就是 $k$ 的同色邊集數次方。
LOJ 2542 隨機遊走
解 首先minmax容斥變成經過集合t的第乙個點就停止的期望步數。對於某個t,設從x開始的期望步數為f x 如果x t,f x 0。否則f x f y in x 1 樹上高斯消元。從葉子往上,可以發現每個點都可以表示為af fa b 於是我們推一波式子,參考,就可以對每個t,o n 求出f root...
LOJ2542 PKUWC2018 隨機遊走
分析 sum limits 1 min sum limits na i sum limits 1 j binom sum limits 1 min sum limits na i n i 0 sum limits 1 min a n max 設 f 表示 f 第一次走到 s 狀態的期望步數。這個東西...
LOJ 3119 隨機立方體
解 極大值至少為1。我們嘗試把最大那個數的影響去掉。最大那個數所在的一層 指乙個三維十字架 都是不可能成為最大值的。考慮容斥。我們試圖求除了最大值以外至少有k個極大值的概率。我們欽定某k個位置是極大值,且欽定順序。這樣的方案數有ni mi li 種。考慮每種方案的概率。從小到大考慮,對於最小的那個極...