UR #19


清掃銀河

如果只進行 1 操作,不難證明存在操作序列的充要條件是將所有 1 邊拿出來,所有點的度數為偶數,構造方案使用歐拉回路。

因為不存在重邊,所以進行 1 操作時每個環環長一定大於 2,因此如果存在一個只有 1 操作的合法操作序列,這個序列的最短長度不大於 \(\lfloor \frac{m}{3} \rfloor\)

然后考慮 2 操作能為 1 操作做些什么。

首先可以發現性質:在一次 2 操作中將集合 \(S\) 中的點變白、其余點變黑進行翻轉,等價於對 \(S\) 中的每一個點 \(x\)\(x\) 變白其余點變黑進行一次翻轉。

那么可以只考慮每次只有一個點翻轉的情況。那么每一個點至多翻轉 \(1\) 次。某個點翻轉一次會導致與這個點直接相連的所有點 1 邊數量的奇偶性產生變化,還會根據當前點度數對當前點 1 邊數量的奇偶性產生變化。

考慮使用 0/1 異或方程描述。設 \(f_i\) 表示第 \(i\) 個點是否翻轉,\(d_i\) 表示 \(i\) 點度數,\(p_i\) 表示初始態下 \(i\) 點連接的 \(1\) 邊數量的奇偶性,那么有異或方程:

\[\sum\limits_{(u,v) \in e}f_v \oplus [2 \not\mid d_u] f_u = p_u \]

如果該方程有解,注意到如果兩個點直接相連,可以把它們的翻轉操作合並,所以這部分的最小操作次數上界約為 \(\lceil \frac{m}{2} \rceil\)。所以只要這個異或方程有解,那么一定存在一種方案在 \(m+1\) 步內完成操作。

使用 bitset 優化異或方程組求解,復雜度 \(O(\frac{Tn^3}{w})\)

通用測評號

Update On 20200405:在看了 nealchen 的三方做法 后深感被教育於是補充了 \(O(n^3)\) 做法

先稍微轉化一下問題,認為每個燃料倉容量無限,進行無限次操作,每次等概率隨機一個燃料倉將 1 單位燃料填進去,問在所有燃料倉燃料 \(\geq b\) 的時刻期望有多少燃料倉燃料 \(\geq a\)

根據期望的線性性可以考慮 \(1\) 號燃料倉的燃料 \(\geq a\) 時存在燃料倉燃料 \(< b\) 的概率。因為每一個燃料倉的概率顯然一樣所以乘 \(n\) 即為答案。

考慮容斥,強制 \(p\) 個燃料倉燃料 \(<b\),選燃料倉方案數為 \(\binom{n-1}{p}\),容斥系數為 \((-1)^{p-1}\)。此時我們只關心這 \(p+1\) 個燃料倉,那么可以將剩余的 \(n-p-1\) 個燃料倉忽略掉,認為只有 \(p+1\) 個燃料倉。

考慮強制這 \(p\) 個燃料倉之后怎么算概率。先把問題抽象一下:初始給出一個序列 \(S\),每一次在 \([1,p+1]\) 的正整數中均勻隨機一個數放入序列 \(S\) 末尾,計算當序列中有 \(a\)\(1\)\(2 \sim p+1\) 的出現次數均小於 \(b\) 的概率。

枚舉 \(2 \sim p+1\) 的出現次數,答案即等於

\[\sum\limits_{x_2,x_3,\ldots,x_{p+1} \in [0,b-1]} \frac{(a-1 + \sum x_i)!}{(a-1)!\prod x_i!} \left(\frac{1}{p+1}\right)^{a+\sum x_i} \]

后面的部分就是序列中的每一個位置都有 \(\frac{1}{p+1}\) 的概率貢獻。而前面的多重排列中 \(1\) 號元素的數量是 \(a-1\) 的原因是序列的最后一個元素必須要是 \(1\),所以僅有 \(a-1\)\(1\) 和其余元素進行多重排列。

熟練的你此時一定已經發現這玩意只和 \(\sum x_i\) 以及 \(\prod x_i!\) 有關,可以寫成 EGF 形式。設 \(F(x) = \sum\limits_{i=0}^{b-1} \frac{x^i}{i!},G(x) = F(x)^p\),那么答案可以改寫為

\[\sum\limits_{j=0}^{p(b-1)} \frac{(a-1+j)!}{(a-1)!} \left(\frac{1}{p+1}\right)^{a+j} [x^j]G(x) \]

如果已知 \(G(x)\) 那么單個 \(p\) 的答案可以 \(O(n^2)\) 計算,問題變為對於所有 \(i \in [1,n-1]\)\(F(x)^i\)

使用 NTT 優化卷積,復雜度 \(O(n^3 \log n)\) NTT 太暴力了,考慮更進一步優化。

非卷積的多項式運算優化可以考慮求導,注意到 \(F' = F - \frac{x^{b-1}}{(b-1)!}\),那么 \((F^i)' = iF^{i-1}F' = iF^i-iF^{i-1}\frac{x^{b-1}}{(b-1)!}\),算出 \(iF^{i-1}\frac{x^{b-1}}{(b-1)!}\) 后對比系數可以直接算。復雜度優化為 \(O(n^3)\)

前進四

Update On 20200405:我是不是學了個假的 segmen tree beats???

有個 \(O(n \log^2 n)\) 的做法,詳見樓房重建,然后此題區分度變為卡常數過 50w = =。

問題是這個做法沒有利用到詢問后綴的要求。先考慮一個暴力:從后往前掃一遍維護后綴 \(\min\),如果新加入的位置的取值比后綴 \(\min\) 小則答案 \(+1\) 並更新后綴 \(\min\)。這個做法跟特殊性質有千絲萬縷的聯系,因為每次掃都一定從序列末尾開始。

樓房重建的做法相當於對時間掃描線維護序列信息,此時由於沿着數組掃能夠利用題目性質,故考慮按照序列下標從大到小掃描線,維護每一個時刻從序列末尾掃到當前位置時的信息。我們需要維護兩個信息:一個是時刻的后綴 \(\min\),另一個是時刻的后綴 \(\min\) 被更新過了多少遍。

注意到對於某一個位置的修改,其對應的是時間軸上的一段區間,故對於一段區間需要支持將大於某個數 \(v\) 的位置的修改次數 \(+1\) 並將其值修改為 \(v\)

對於僅修改 \(\geq v\) 或者 \(\leq v\) 的位置的問題,使用吉司機線段樹。復雜度 \(O(n \log n)\)


免責聲明!

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



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