ARC174 rt記錄

Sktn0089發表於2024-03-18

賽時過了 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)\)