The 3rd Universal Cup. Stage 3: Ukraine

第一篇做題筆記,不以時間軸的方式記錄比賽,只記錄解題過程。

這場難度在 UCup 中算很低,最強的 USA1 甚至在兩個小時以內就破台了。

Problem A. Aibohphobia

Tags: casework, palindrome

給定字串 ,請將其重新排列使每個長度 的前綴都不是回文。

  • 多筆測資、

顯然只有一種字元無解,當有兩種字元的時候要 ,可以得到必須要有某個字元只出現一次,否則無解。

當有三種以上的字元時,將字串排序並 reverse(1 + ALL(s)) 後輸出即可。

Problem B. Breaking Bad

待補

給定一個 的矩陣 ,請問在所有 的排列 中, 可能有哪些值。

Problem C. Chemistry Class

Tags: greedy

給定 個整數 ,請將其兩兩配對滿足

  • 不存在差距 的配對(不合法
  • 差距 的配對數量盡量多(好配對
  • 多筆測資、、值域

以下令差距在 之間的配對為 壞配對

以下令 ,觀察:

  • 當配對 合法,則改成 也合法。
  • 當配對 都是好配對,則改成 也是好配對。
  • 當配對 都是壞配對,則改成 也仍然合法。

因此,可以得出以下性質:

  1. 配對不會相交,可以看成括弧序列。
  2. 好配對不會包著任意配對,也就是說好配對一定是 的形式。
  3. 壞配對只可能包著好配對,也就是說一定是 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,使得 最大。

  • 多筆測資、