賽時過了 ABCDE(5/6)
F 出題人是弱智吧,出奇偶分討模擬題,賽後重寫了一遍程式碼就過了。
E. Existence Counting
題意:給出 \(n,k\) 和序列 \(P_{1...k}\)。稱一個序列是好的,當且僅當長度為 \(k\),所有整數範圍為 \([1,n]\) 並且兩兩不同,這裡保證 \(P\) 是好的。對於每個數 \(x\in [1,k]\),求字典序 \(\le P\) 的所有好序列中 \(x\) 的出現次數。
\(1\le k\le n\le 3\times 10^5\)
考慮列舉第一個不同的位置 \(i\)。
那麼對於數字 \(P_{1...i-1}\),他們多出現了 對應方案數 次。
對於其他數字,可以分為兩部分:\(<P_i\) 的和 \(\ge P_i\) 的,同一部分的數字貢獻都是一樣的。
設 \(cnt\) 表示 \(<P_i\) 的數字個數。
- \(<P_i\) 的貢獻
可以在 \(i\) 位置出現,也可以在後面出現。
加起來,為 \(A(n-i,m-i)+(cnt-1)(m-i)A(n-i-1,m-i-1)\)。
- \(\ge P_i\) 的貢獻
為 \(cnt(m-i)A(n-i-1,m-i-1)\)。
總方案數為 \(cnt\times A(n-i,m-i)\)。
我們需要支援給 \([1,P_i-1]\) 中除去 \(P_{1...i-1}\) 的數字做加法,給 \([P_i,n]\) 中除去 \(P_{1...i-1}\) 的數字做加法。
考慮倒著列舉 \(i\),每次把 \(P_i\) 的貢獻清零,使用樹狀陣列即可。
F. Final Stage
題意:Alice 和 Bob 玩遊戲。給出 \(l_{1...n},r_{1...n}\),編號為奇數的是 Alice 玩,偶數是 Bob 玩。有一堆石子,現在 \(i=1...n\),每次當前玩家取出一些石子,個數為 \([l_i,r_i]\),不能取的玩家輸,對手贏。有 \(q\) 次詢問,每次給出 \(C\) 表示石子個數,求誰能贏,或者都不會贏。
\(1\le n,q\le 3\times 10^5,\space 1\le l_i\le r_i\le 10^9\)
樸素的 dp 是簡單的,設 \(f[i,j]\) 表示從 \(i\) 到 \(n\) 遊戲,初始石子個數為 \(j\),是否能贏。
我們考慮直接維護 \(f[i,]\),輸和贏一段一段交替出現,最後一段是平局。
考慮維護 \(f[i,]\) 的差分,即相鄰兩段的分界線。
發現每次其實會給輸的段的 \([l,r]\) 做加法:\(l\gets l+l_i,\space r\gets r+r_i\),然後把所有段的輸贏狀態取反。
用差分描述:把第奇數個 \(1\) 往右平移 \(l_i\) 單位,把第偶數個 \(1\) 往右平移 \(r_i\) 單位,然後給位置 \(1\) 賦值成 \(1\)。
注意到有些平移後輸的段可能滿足 \(l>r\),此時我們需要消去對應的兩個 \(1\)。
考慮使用兩個堆 \(q_1,q_2\),分別維護奇偶兩種,相鄰的 \(1\) 之間的距離。若距離為 \(0\),就可以消去。
每次取出 \(q_1\) 或 \(q_2\) 進行更新即可,兩個堆都還要額外圍護一個整體加法標記。
我們還需要動態支援消去一些 \(1\),考慮使用連結串列維護每個 \(1\) 的位置即可。
時間複雜度 \(O(n\log n)\)。