因為我還不會 D1T3 和 D2T3 所以沒有題解。
\(\text{D1T1}\) 季風
記 \(prex_i=\sum_{j=1}^i x_i\),\(prey_i\) 同理。
考慮列舉 \(ans \bmod n\) 的值為 \(t\)。
相當於解關於 \(v\) 的不等式 \(|X-vprex_n-prex_t|+|Y-vprey_n-prey_t| \leq k(vn+t)\) 的 \(v\) 的最小非負解。
隨便解一下,時間複雜度 \(O(n)\)。
\(\text{D1T2}\) 魔法手杖
先將所有元素按高位到低位插入到 trie 樹上。
設 \(min_u\) 表示 \(u\) 子樹內 \(a_i\) 最小值,\(sum_u\) 表示 \(u\) 子樹內 \(b\) 的和。
考慮按位貪心,記當前要檢查 \(now\) 是否可以成為答案。
那麼我們可以設計一個簡單的 dp:設 \(val_u\) 表示從 trie 的根走到 \(u\) 號點對應的 \(x\) 值是多少,\(lim_u\) 表示一路走過來要用加法操作的數的最小值是多少,\(minco_u\) 表示最小花費是多少。
轉移是簡單的,這樣我們就得到了一個 \(O(nk^2)\) 的做法。
接下來進行一些觀察,假設當前在確定答案的第 \(t\) 位,那麼我們可以發現一些點在確定 \(t+1\) 位時的 dp 值和確定第 \(t\) 位時的 dp 是完全一樣的。
具體的就是 trie 數上對應位 \(\geq t+1\) 的節點 dp 值不變,然後對應位恰好為 \(t\) 的 dp 會變,剩下的 dp 值基本和父親相同。
然後考慮 bfs,按位列舉答案之後處理一個深度的點的資訊即可,需要注意一下走到空節點是答案怎麼更新。
時間複雜度 \(O(nk)\)。這題似乎 xor3 比較強,考場上過不了 xor3 可以過 xor4,5,6,7。
\(\text{D2T1}\) 迷宮守衛
考慮如果只讓你確定第一個數是好做的。
可以直接二分然後 dp 一下。
具體的假設二分的值是 \(x\),把 \(<x\) 的看成 \(0\),\(\geq x\) 的看做 \(1\),相當於你不能走到 \(0\)。
轉移式子是 \(f_x=\min\{f_{2x}+w_x,f_{2x}+f_{2x+1}\}\)。
考慮接下來我們確定了 \(p_1\),然後從 \(p_1\) 對應的點向上跳,並進入兄弟子樹。
這個時候我們嘗試撤銷 \(p_1\) 情況下的決策,具體的如果發現仍然可以滿足 \(\geq p_1\),那我們就撤銷並進入子樹,否則直接進入。
然後重複上述流程即可。
時間複雜度 \(O(2^nn^2)\)。大樣例考場上只跑了 \(0.044\text s\)。可能有更高明的做法。
\(\text{D2T2}\) 重塑時光
總方案數是 \((n+k)!\)。
設 \(f_{S,i}\) 表示當前用了 \(S\) 集合中的點,劃分為了 \(i\) 個非空集合方案數,算出這個就很容易統計答案了。
設 \(g_S\) 表示 \(S\) 中的拓撲序數量。
設 \(h_{S,i}\) 表示 \(S\) 中劃分為 \(i\) 個非空獨立集的方案數。
\(g_S\) 可以在 \(O(2^nn)\) 求出來,\(h_{S,i}\) 可以在 \(O(3^nn)\) 求出來。
對於 \(f_{S,i}\) 需要容斥,用求出來的 \(h_{S,i}\) 去做一做就行了,這一部分是 \(O(3^nn^2)\)。
最後複雜度是常數比較小的 \(O(3^nn^2)\),是可以過的。應該還有更高明的做法。
考場上沒整出來這個容斥是怎麼回事呢,唐完了。