一類匹配問題的移位技巧(The SHIFT Trick)


引子:(廣義錯排問題)有$n$個班級,第$i$個班有$a_i$人,每人都寫一張賀卡送給另一個人,問是否存在一個分配方案,使得

  • 每個人都獲得恰好一張賀卡,並且與這張賀卡的作者來自不同班級。

當$a_i = 1$時,該問題退化成【錯排】問題。

 

定理:令$m = \sum_{i} a_i$表示總人數,則存在一個合法的分配方案當且僅當

$$ \max_i \{ a_i \} \leq \frac m 2. $$

證明:

  • 先證充分性。若存在$a_i > m/2$,即有一個班的人數超過總人數的一半,則由鴿籠原理,這個班中至少有一個人收到來自這個班的賀卡;從而不存在一個合法的分配方案。
  • 再證必要性。若對所有$i$,都有$a_i \leq m/2$,則將$m$個人按照班級順序排成一列$b_0, b_1, \dots, b_{m-1}$,其中同一個班級的人組成連續的一段,考慮對每個$0 \leq i < m$,將$b_i$的賀卡分配給$b_{(i+\lfloor m/2 \rfloor) \bmod m}$,為一個合法的分配方案。因為,$b_i$與$b_{(i+\lfloor m/2 \rfloor) \bmod m}$必不在同一個班,不然這個班的人數將超過$m/2$。

在以上證明中,我們把$b_i$做了一個長度為$\lfloor m/2 \rfloor$的移位。我們姑且將其稱作【移位技巧】(the SHIFT trick)。在一些題目中,往往要求給出具體分配方案,這時移位技巧的優勢就體現出來了,因為只需要極短的代碼。我才不會說我無數次因為給出方案太麻煩導致知道怎么卻到最后也沒做出來

 

 

CodeForces 1381C. Mastermind

給定一個長度為$n(n \leq 100,000)$的數組$b_1, b_2, \dots, b_n (1 \leq b_i \leq n+1)$,以及參數$x, y (0 \leq x \leq y \leq n)$,要求構造一個數組$a_1, a_2, \dots, a_n (1 \leq a_i \leq n)$,使得

  1. $a$和$b$中恰好有$y$個元素相同;
  2. 恰好有$x$個下標$i_1, i_2, \dots, i_x$,使得$b_{i_s} = a_{i_s}$。

解:先考慮一個簡化版問題$x = 0$的情形,即要求$a$中有$y$個元素與$b$中相同,但要求【錯排】。當$y = n$時,退化成【廣義錯排問題】,即要求出現最多的元素的出現次數$\leq n/2$。對於$y < n$的情形,我們仍然對數組$b$應用一次【移位技巧】得到$c_1, c_2, \dots, c_n$,設$b$與$c$有相同元素的下標(稱為【沖突】下標)個數為$k$,設$f$表示$b$中出現最多的元素個數,則

$$ k = \max \left\{ 2f-n, 0 \right\}. $$

(感謝MicroMaker指正。)

為解決這$k$個【沖突】下標,我們注意到,一定存在一個值$1 \leq e \leq n+1$,其不在$b$中出現;從而我們可以把【沖突】下標對應$c$的元素設為$e$。而我們必須恰好將$(n-y)$個$e$設為$c$的元素,於是必須滿足

$$ k = \max \left\{ 2f-n, 0 \right\} \leq n-y. $$

(若不滿足則無解。)對於多出來仍未設置的$e$,其實是可以隨意設置的。

 

現在我們來考慮一般情況下$x \neq 0$的問題。我們假設已經選出$x$個下標,將$b$與$a$對應的部分設為相同元素。根據之前的分析,對於剩下的$x$個下標以外的下標,我們希望【沖突】下標個數$k$盡可能小;於是我們的策略是貪心選取$x$次,每次選擇當前出現次數最多的元素的一個下標。至此,問題得到了完美解決。

 

CodeForces 1280C. Jeremy Bearimy 

CodeForces 1387B2. Village (Maximum)

給定$n$個節點的樹,每個節點上有一個人,這$n$個人在玩“大風吹”(即每個人要去到與自己當前所在節點不同的節點)。要求最大化所有人移動距離之和。

解:對於樹上的每一條邊$e$,邊權為$w_e$,設這條邊將樹分成大小為$x_e$和$y_e$的兩個部分,則至多有$2\min\{x_e, y_e\}$個人可以經過這條邊。從而得到最大距離和的上界

$$ \sum_e 2 w_e \min\{ x_e, y_e \}. $$

這個上界實際上是可以達到的。我們考慮這棵樹的【重心】$G$,即若以$G$為根建樹,則$G$的兒子節點對應的子樹大小均$\leq n/2$。我們可以把$G$的每個兒子的子樹看作是一個【班】,特別地,$G$本身也看作是一個班(只有$G$一個人),由於每個班的人數都$\leq n/2$,故可應用【廣義錯排問題】。在錯排方案中,每個節點都對應到與他不同子樹的節點,因此每條邊被經過的次數都能達到上界$2\min\{x_e, y_e\}$。

 

我們應用【廣義錯排問題】給出了具體的分配方案,但需要先求出樹的重心。其實有更簡潔的做法:直接求出樹的DFS序(以任意節點為根),在DFS序上直接應用【移位技巧】就能得到一個最優方案了。

原因是假若我們選擇任意一個重心$G$,兩個在DFS序中距離$\lfloor n/2 \rfloor$的節點一定不會同時在$G$的某個兒子對應的子樹中(不然,這個子樹的大小就超過$n/2$了,與$G$是重心矛盾)。

 

加強版:若要求這$n$個人的移動的形成一個輪換,即$p_1$去到$p_2$,$p_2$去到$p_3$,...,$p_{n-1}$去到$p_{n}$,$p_n$去到$p_1$。仍然最大化所有人移動距離和。

這同樣也能達到上述最大上界。我們先考慮一個簡化版問題。

 

問題:(廣義錯排問題加強版)設有$n$個班級,每個班級有$a_i$人,要求將所有人排成一個環,使得沒有相同班級的人相鄰。

定理:以上問題所有人能排成一個環,當且僅當,$\max_i \{ a_i \} \leq m/2$,其中$m = \sum_i a_i$。

我們可以看到,【廣義錯排問題】是以上問題的一個簡化版本。

證明:若$a_i > m/2$,則顯然不行。若對所有班級$i$,$a_i \leq m/2$,我們用歸納法證明所有人能排成一個環。

按總人數$m$歸納。

當總人數$m = 2$時,只有一種情形,兩個班,且$a_1 = a_2 = 1$,這個情況顯然所有人能排成一個環。

當總人數$m = 3$時,也只有一種情形,三個班,且$a_1 = a_2 = a_3 = 1$,這個情況顯然所有人能排成一個環。

對$k \geq 4$,我們設$2 \leq m < k$時,命題成立。我們不妨設當前有$n$個班,且$n/2 \geq a_1 \geq a_2 \geq \dots \geq a_n$。我們從第一個班與第二個班中分別抽出一個人,則第一個班剩下$a_1-1 \leq (m-1)/2$人,第二個班剩下$a_2-1 \leq (m-1)/2$人,其余班$i \geq 3$的人數仍為$a_i$。則剩下的$m-2$個人應用歸納假設,可以排成一個環$\pi$。我們從環$\pi$中任選兩個相鄰的人,設他們分別來自$x$和$y$兩個班$x \neq y$,則必有($x \neq 1$且$y \neq 2$)或者($x \neq 2$且$y \neq 1$),不妨設是前者,則我們把之前取出的第一個班和第二個班的人插至他們中間,形成$x \to 1 \to 2 \to y$。於是我們構造出了一個$m$個人的環。故$m = k$時命題成立。

 

我們回到原問題。這次我們再次選取重心$G$,$G$的每個兒子節點對應的子樹看作是一個【班】,$G$自己也看作是一個【班】(這個班只有$G$一個人),根據【廣義錯排問題加強版】,我們可以得到所有節點的一個輪換。從而移動距離和達到上界。

 

AtCoder AGC 018 D. Tree and Hamilton Path

給定$n$個節點的樹,要求構造一個排列$p_1, p_2, \dots, p_n$,使得從$p_1$走到$p_2$,再從$p_2$走到$p_3$,...,最后從$p_{n-1}$走到$p_n$的距離之和最大。

解:根據之前的論斷,我們同樣得到最大距離和的上界

$$ S = \sum_e 2 w_e \min\{ x_e, y_e \}. $$

但很不幸,這次達不到上界了,但應該仍然與重心有關。任何一棵樹,都是以下兩種情形之一:

  1. 存在一條邊$e$,將樹分成大小相等的兩半,即$x_e = y_e = n/2$(暗含$n$是偶數)。此時,我們至多經過這條邊$n-1$次,從而最大距離和的上界縮小為$S - w_e$。
    這個上界是能達到的。考慮這條邊分成的兩個部分的節點分別是$x_1, x_2, \dots, x_{n/2}$與$y_1, y_2, \dots, y_{n/2}$,考慮按以下順序走
    $$ x_1 \to y_1 \to x_2 \to y_2 \to \dots \to x_{n/2} \to y_{n/2}. $$
    按這個順序即能達到最遠距離和。
  2. 存在唯一一個重心節點$G$,且$G$的兒子對應的子樹大小均$< n/2$。設$G$的兒子節點依次為$e_1, e_2, \dots, e_k$(我們也同樣用$e_i$表示$G$與節點$e_i$之間的連邊,並用$\text{size}(e_i)$表示以節點$e_i$為根的子樹大小,則$\text{size}(e_i) < n/2$)。對$G$的每個兒子節點$e_i$,邊$e_i$至多經過$2 \text{size}(e_i)$次,並且要達到這個次數,起始點必須不能在$e_i$子樹內部;但我們無法對所有$e_i$都滿足這個條件,所以至少有一條邊$e_i$只能經過$2 \text{size}(e_i) - 1$次。因此,最大距離和的上界縮小為$S - \min_i \{ w_{e_i} \}$。
    這個上界是能達到的。我們應用【廣義錯排問題加強版】,把除了$G$以外的所有節點排成一個環,要求同一個子樹的節點不相鄰。設$e_{i^*}$是權值最小的邊,我們從節點$G$出發,然后走到$e_{i^*}$,而剩下的走法繞環一周即可。如此,則達到上界。

 

CodeForces 1396E. Distance Matching

這里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM