AGC041F Histogram Rooks


有生之年自己做出了一個 AGC F 還踩了標算,但是好像在我之前已經有人踩過標算了,再鞭屍一波也無可厚非 hhh


看到“全部被覆蓋” 條件不好做,考慮容斥,即選擇若干個位置強制它們不覆蓋,那么會有位置不能放車,而其余的位置可以選擇放或者不放,方案數可以計算。但暴力枚舉不優秀。在后文中為了描述方便定義行連續段表示的是某一行中不包含被刪掉的格子的極長格子段,列連續段同理。

注意到這個網格的行並不連續(即對於某個確定的行,其行連續段可能有多個),但列是連續的(即第 \(i\) 列只有 \(1 \sim h_i\) 這一個列連續段)。那么如果確定了某些列上存在格子沒有覆蓋,那么這些列上的所有格子一定不能放車。

考慮枚舉存在位置強制不覆蓋的列的集合 \(S\),那么這些列的所有格子就不能放車。此時對於一個長為 \(len\)、有 \(p\) 個位置所在的列是強制不覆蓋的列的行連續段,枚舉這一行上的 \(p\) 個位置有哪一些位置選擇了強制不覆蓋,有兩種情況:

  • 在這個行上沒有任何位置選擇強制不覆蓋,那么剩余 \(len-p\) 個位置能自由選擇,方案數為 \(2^{len-p}\)
  • 在這個行上存在位置選擇強制不覆蓋,此時這行不能放車,方案數為 \(1\)。枚舉有多少個位置選擇強制不覆蓋,乘上容斥系數貢獻是 \(\sum\limits_{j=1}^p (-1)^j \binom{p}{j}\)

那么這一個行連續段對答案的貢獻就是 \(2^{len-p} + \sum\limits_{j=1}^p (-1)^j \binom{p}{j}\)。注意到 \(\sum\limits_{j=1}^p (-1)^j \binom{p}{j} = -[p \neq 0]\),可以改寫貢獻為 \(2^{len-p} - [p \neq 0]\)。最后將所有貢獻的答案乘起來。


然而上面的做法存在問題,因為無法確定強制選擇了位置沒有覆蓋的列在方案中是否確實選擇了強制不覆蓋的格子。如果某一列並沒有選擇會導致方案的算重。

所以繼續考慮容斥,在枚舉集合 \(S\) 的基礎上枚舉 \(S\) 最后沒有選擇強制不覆蓋格子的子集 \(T\) ,容斥系數是 \((-1)^{|T|}\)

這樣某個行連續段中如果存在 \(p\) 個位置所在的列在集合 \(S\) 中,有 \(q\) 個位置所在的列在集合 \(T\) 中,方案數將變為 \(2^{len-p} - [p \neq q]\)。值得注意的是雖然集合 \(T\) 對應的列集合不存在任何格子選擇不覆蓋,但是仍然需要認為這些列的所有格子無法放置,否則無法達到容斥效果。

這樣就可以正確地算出答案了。


這玩意顯然太慢。為了優化可以注意到以下若干性質:

  • 計算某個行連續段的貢獻只關心兩個量:\(p\)\([p \neq q]\)
  • \(p \geq q\),所以 \([p \neq q] = [p - q > 0]\)
  • 對於左端點所在列相同、右端點所在列相同的兩個行連續段,它們的貢獻一定相同。把所有這樣的行連續段看成一個集合,那么這樣的集合最多只有 \(N\) 個,而且一個集合內所有行連續段的所在行一定是連續的若干行。

簡單來說看一張圖就好,下面這個圖里相同顏色的所有行連續段的貢獻顯然是相同的,可以一起計算,且可以簡單證明這樣的顏色數量至多為 \(N\)

2020-04-01 12-08-24屏幕截圖.png

找這樣的矩形只需要在初始圖中找到 \(h\) 最小的若干列,再通過這些列將原圖划分為若干個子部分,每個部分遞歸處理。

而且還可以發現一個事情:

上圖中對於紅色的行,其覆蓋的所有列中在集合 \(S\) 中的列的數量 = 淺綠色覆蓋的所有列中在集合 \(S\) 中的列的數量 + 藍色覆蓋的所有列中在集合 \(S\) 中的列的數量 + 第 4 列是否在集合 \(S\) 中。

這是一個類似於子問題的結構,也就是說某種顏色覆蓋的列的數量等於其正上方所有其他顏色矩形覆蓋的列的數量加上其獨有的數量。

(注:這里的正上方指的是在上方而且存在重合的邊界)


給每一個矩形一個標號,並認為如果矩形 \(A\) 在矩形 \(B\) 的正上方則 \(A\)\(B\) 的兒子。

設計一個 DP:\(f_{i,j,0/1}\) 表示在 \(i\) 號矩形中,其覆蓋的列有 \(j\) 列在集合 \(S\) 中,且是否存在某一列在集合 \(S\) 卻不在集合 \(T\) 中,在這樣的情況下所有方案中這個矩形和在它上方的所有矩形的方案數的總和。轉移先從兒子處將該數組合並,再考慮其獨有的若干列的選擇,最后乘上每行如何放車的系數。因為每行的方案一致所以復雜度可以做到 \(O(N^2 \log N)\),而所有可能的轉移系數只有 \(O(N)\) 種,通過預處理可以將復雜度優化為 \(O(N^2)\)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM