The 3rd Universal Cup. Stage 3: Ukraine
- 連結:https://qoj.ac/contest/1714
- 時間:2024 Oct 30, 17:40-22:40
- 團隊:ネクロマンサー (SorahISA)
- 成績:7 / 12, Penalty 910, dirt 12% ( A B C D E F G H I J K L )
第一篇做題筆記,不以時間軸的方式記錄比賽,只記錄解題過程。
這場難度在 UCup 中算很低,最強的 USA1 甚至在兩個小時以內就破台了。
Problem A. Aibohphobia
Tags: casework, palindrome
給定字串 ,請將其重新排列使每個長度 的前綴都不是回文。
- 多筆測資、
顯然只有一種字元無解,當有兩種字元的時候要 、、,可以得到必須要有某個字元只出現一次,否則無解。
當有三種以上的字元時,將字串排序並 reverse(1 + ALL(s)) 後輸出即可。
Problem B. Breaking Bad
待補
給定一個 的矩陣 ,請問在所有 的排列 中, 可能有哪些值。
Problem C. Chemistry Class
Tags: greedy
給定 個整數 ,請將其兩兩配對滿足
- 不存在差距 的配對(不合法)
- 差距 的配對數量盡量多(好配對)
- 多筆測資、、值域
以下令差距在 之間的配對為 壞配對。
以下令 ,觀察:
- 當配對 及 合法,則改成 及 也合法。
- 當配對 及 都是好配對,則改成 及 也是好配對。
- 當配對 及 都是壞配對,則改成 及 也仍然合法。
因此,可以得出以下性質:
- 配對不會相交,可以看成括弧序列。
- 好配對不會包著任意配對,也就是說好配對一定是 的形式。
- 壞配對只可能包著好配對,也就是說一定是
BGG...GGB中間有偶數個G的形式。
採用 greedy 配對的方式,由左至右配對 GG,當不會讓壞配對 B...GGB 差距超過 時就配對,否則就配對壞配對。
因為這總是保證了最多的好配對,所以 greedy 可以得到最佳解。
Problem D. Daily Disinfection
Tags: casework
給定長度 的 字串 ,每次可以交換相鄰兩個字元,求最少交換次數使每個位置都出現過至少一次
0。
- 多筆測資、
每個 1 都一定要移開,假設 0 那每個 1 都一定能往右移動。
觀察到只有在 1.101.101.101.1 這種 case(頭尾都是 1 且沒有連續的 0)才會讓 1 必須被挪動第二次,此時一定是挪動最小塊的連續 1。
Problem E. Equalizer Ehrmantraut
Tags: math
請求出有多少個長度為 的整數序列對 滿足 且對所有 皆有 。
模 輸出。
長一樣當然都是合法的,考慮當有數字不同的時候,W.L.O.G. 是第一個不同的位置且 非嚴格遞增:
- 此時 一定等於 ,由 可以推得 。
- 此時 一定 ,由 可以推得 。
也就是合法的序列對長相是 。枚舉 中的最大值 後可以得到答案:
即可 求解。
Problem F. Formal Fring
待補
定義 是非負整數集合 的數量,滿足 且不存在 使得 。
請求出 模 的值。
Problem G. Goodman
AC 但還不會證明,待補
定義兩個 的 permutation 的複合 為 。
給定一個排列 ,請求出一個排列 使 最大。
- 多筆測資、
Problem H. Highway Hoax
Tags: dp, ntt
給一棵 個點的樹,邊是有向的,一開始有某些位置各有一個棋子,每次操作可以將一個棋子沿著出邊移到相鄰的點,但移動完後會將邊反轉。
定義合法狀態是每個點的棋子數量皆 ,求從原始盤面可以抵達多少種合法狀態。
模 輸出。
先觀察到任意邊 只會有至多一次的 操作,移回去再移回來並沒有意義。當對這棵樹定根後,會具有以下性質:
- 合法狀態下,每個子樹的棋子數量必定是原始棋子數量 以內,取決於跟父親連邊的方向。
這就會想使用 DP 解決:令 代表以 為根的子樹,且 有多一個 / 剛剛好 / 少一個棋子的合法狀態數量。這樣就可以得到以下轉移:
待補
每個小孩的 DP 值對應到多項式 。
轉移可以把所有小孩的多項式 offset 一個 之後 NTT 乘起來,但要注意要每次挑最短的兩個多項式做 NTT,否則複雜度仍會退化為 。
一個方便的 trick 是把所有多項式丟進 queue(deque)裡,每次取出前兩個做事之後再放到最後面,這個的複雜度可以透過參考線段樹的長相感性證明。
Problem I. Increasing Income
Tags: dp
定義兩個 的 permutation 的複合 為 。
給定一個排列 ,請求出一個排列 使 最大。
- 是 ,也就是前綴最大值數量。
- 多筆測資、
- 首先,一定有下界 跟上界 。
Proof
- 下界: 時答案必定 。
- 上界:如果答案 ,那一定有至少 個位置在 跟 之中都有貢獻。
把那些有貢獻的位置抓出來,他們會形成更長的 LIS,產生矛盾。
現在考慮如何構造滿足上界的答案,首先先把 LIS 抓出來( 滿足 且 )。
接著要處理剩下的元素,先 獨立 觀察 可以放的位置:
- 在不破壞 的貢獻的前提下插進 裡面:當滿足 且 時可以將 放到 跟 中。
- 在讓自身能產生貢獻的前提下插進 裡面:當滿足 或 時可以將 放到 跟 中。
總上兩點,可以得到當 放在滿足 且 的最小的 前面就能不破壞原有的貢獻並維持自身的貢獻。
如果有多個 可以放在 跟 之間,這些數字必定可以被分到兩類: 跟 。每個數字必定且只滿足其中一個條件(否則就不會被放在這裡),只要確保所有第一類的數字依照位置 排序、第二類的數字依照值 排序,就能保證所有區間內的數字都有貢獻。
時間複雜度:。
Problem J. Jesse's Job
Tags: N/A
給定一個排列 ,你要將排列中的元素塗上黃色
Y或紅色R(至少各一),並最大化將黃色跟紅色分別排序之後的 。請構造一組解。
- 多筆測資、
先建 的有向邊,此時圖會被分成許多個環。觀察到如果圖有兩個以上的連通塊,對各自分別排序就能將整個陣列排序。以下考慮圖只有一個連通塊的情況。
如果把環切成 兩個部分:,滿足 ,則可以發現:
- 選了位置 會選到數字 (選了位置 會選到數字 )。
- 選了位置 會選到數字 (選了位置 會選到數字 )。
因為 跟 比所有其他數字都還要小,所以把位置 排序後只會讓 ,;把位置 排序後只會讓 ,。
至此,就得到了排好 個數字的方法,而顯然在只有一個環的情況下不存在排好恰 或 個數字的方法。
Problem K. Knocker
Tags: dp
給定正整數陣列 ,你可以選擇若干數字 並令 ,請問有幾種可能的 ?
模 輸出。
- 、
- 每次的 操作必定可以取 。
Proof
此處我們嘗試證明當 太小可以換成多個更大的 達成相同操作。
假設最大值 ,那麼取 也可以讓所有會被修改到的數字變成跟 一樣,此後最大值必定 。
接著取 、,一直到 ,每次的操作只會把 的數字變成 。
注意到每次操作中剩下的數字最大是 ,而 顯然為真。
上述 Claim 1 的最大用處是把取 操作變成減法操作,注意對一個數字「減法」之後他會變成不到一半。
- 對每個合法的狀態都存在一種每個數字只被「減法」影響到至多一次的方案。
Proof
先將陣列由大到小排序過,可以發現一個「減法」操作影響到的是一段前綴,而且這段前綴在被「減法」之後仍然遞減。
當有另一個減法操作()影響到該區間時,該區間會變成「被 跟 影響到的前綴」跟「只被 操作影響到的後綴」。那不如將創造出這段區間的那次操作()先變成 做完前綴,再做一次 操作解決後綴。
注意到因為前綴數字 by Claim 1,所以並不會被 跟 都影響到。
將陣列降序排序後,就可以來嘗試 DP 了:狀態 代表 是第一個沒有被「減法」的數字,且當前(為了不二次影響前面的數字)能取的 下界是 的陣列數量。
轉移採用遞推,枚舉合法的 作為轉移,維護會被影響到的數字( 的最小 ),再拿滿足轉移條件的狀態 去更新 。
時間複雜度:。
轉移應該可以用前綴和壓掉一個 ,待補。
Problem L. Lalo's Lawyer Lost
待補
給定一棵 個點的仙人掌,定義 是兩點的最短距離,請將這些點分成 個 pair,使得 最大。
- 多筆測資、、