第九屆中國大學生程式設計競賽 深圳站(CCPC 2023 Shenzhen Site)/ The 2nd Universal Cup. Stage 25: Shenzhen

FantasyNumber發表於2024-10-25

D. Bot Brothers

題意:有一棵 \(n\) 個點的樹,\(m\) 個葉子,編號為 \(1 \sim m\)。兩人在樹上博弈,均從根出發,輪流行動,每次走向一個當前所在節點的子節點,如果在葉子就不移動。最終如果兩人所在葉子編號一個是另一個 \(+1\)\(\pmod m\) 意義下),則 \(+1\) 的一方獲勝。

觀察到先手不可能勝利,因為後手可以和先手走一樣的路。那麼只需要判斷先手是否能到平局即可,設 \(f_u\)\(u\) 子樹中所有葉子節點的集合,\(g_u\)\(u\) 子樹中所有葉子節點 \(+1\)(若是 \(m\) 則為 \(1\))的集合。設先手當前在 \(x\),後手當前在 \(y\),若 \(f_y\) 不包含 \(g_x\),那麼 \(x\) 可以一直走到那個不在 \(f_y\) 出現的節點,所以後手要保證每次走完之後 \(f_y\) 都要包含 \(g_x\)

所以可以直接模擬 \((x,y)\) 的過程,\(dfs(x)\) 的時候順便記錄當前 \(y\) 的值,然後往下走的時候 \(y\) 要走到一個 \(lca(g_{x'})\) 的祖先上,那麼看看 \(y\) 是不是 \(lca(g_{x'})\) 的祖先即可(記得特判 \(|g_x' =1|\) 可以不移動。

複雜度 \(\Theta(n\log n)\)

E. Two in One

題意:有一個長度為 \(n\) 的序列,找到一個區間和兩種顏色使得兩種顏色出現次數的二進位制或最大。

若只選一個顏色肯定選 \([1,n]\) 和其中出現最多次數的區間。選兩個的話,直覺告訴我們最大值肯定必選,此時看看第二個選什麼,若最大值最高位是 \(t\),且存在一個其他顏色的最高位也是 \(t\),那麼答案肯定可以取到 \(2^{t+1} - 1\),因為我們可以每次把區間縮減一個,當其中一個顏色出現次數 \(<2^t\) 時停止。

考慮擴充這個結論,那麼就是找到兩個數 \(x, y\),使得 \(x | y | highbit(x\& y)\) 最大,證明與上面類似,顯然取最大和次大。

複雜度 \(\Theta(n+\log V)\)

K. Quad Kingdoms Chess

題意:給定兩個軍棋序列,每次兩個人取出序列首部連個數,若相同同時刪掉,否則小的那個刪掉。判斷最終結果是否為平局,支援動態單點修改。

首先觀察不帶修改怎麼做。發現肯定先看兩個序列第一次出現的最大值,它們必須得相同,否則不可能平局,然後設它們在第一個、第二個序列第一次出現位置分別是 \(x,y\),則 \(a[1,x]\)\(b[1,y]\) 可以一起刪除,然後就轉移到了一個子問題。

那麼平局的充要條件就是把每個序列的 \(suf_i\) 為字尾最大值求出來,把所有 \(c_i = suf_i\)\(c_i\) 取出來,兩個序列的這個可重集合要相等,那麼直接上雜湊即可。

考慮單點修改,考慮套路地上線段樹,合併左右子樹的時候可能左邊部分有一部分字尾是小於右邊最大值的,所以可以參考 樓房重建 的套路,單側遞迴求得所需部分。

複雜度 \(\Theta((n+q)\log^2 n)\)

L. Rooted Tree

題意:給定一個節點,\(k\) 次每次隨機選擇一個葉節點往下面塞 \(m\) 個新節點,問所有節點深度總和的期望。

考慮期望的線性性,可以對每次操作新加的節點獨立計算貢獻。設第 \(i\) 次操作後葉子節點個數是 \(cnt_i\),葉子節點的深度期望是 \(f_i\),那麼第 \(i\) 次新加的節點期望深度和就是 \((f_{i-1} + 1) \times m\),並且 \(f_{i} = \dfrac{f_{i - 1} \times cnt_{i-1} + (f_{i-1} + 1) \times m}{cnt_i}\),顯然 \(cnt_i = i \cdot (m-1)+1\)

複雜度 \(\Theta(k)\)

M. 3 Sum

題意:給定 \(n\) 個大整數,求 \(a_i + a_j + a_k \equiv 0 \pmod{M},M=10^k - 1\)\((i,j,k)\) 個數。

顯然可以先讓每個 \(a_i\)\(M\) 取模,然後找到 \(a'_i + a'_j + a'_k = 0,M,2M\) 的個數即可。後面這個顯然可以使用 hash 來解決,多用幾個模數判斷就行。

\(M\) 取模時,由於 \(M=10^k - 1\),那麼 \(10^k \equiv 1 \pmod{M}\),可以除以 \(10^k\) 然後加上這個商繼續除,顯然不會超過 \(\Theta(bit)\) 次。

相關文章