1. 程式人生 > >【CDQ分治+FFT】LGP4566 [CTSC2018]青蕈領主

【CDQ分治+FFT】LGP4566 [CTSC2018]青蕈領主

【題目】
原題地址
有一個長度為 n n 的排列 a a ,給定 l i

l_i ,表示 a i l i
+ 1 a i a_{i-l_i+1} \dots a_i
在排序後公差為 1
1
,且 l i l_i 為滿足條件的最小數字,求方案數。 n 5 × 1 0 4 n\leq 5\times 10^4

【解題思路】
以下思路來自大佬的部落格

神仙題。
很容易證明所有的連續區間只能相離或者相互包含,不可能相交。因此只要存在區間相交或者 L [ n ] n L[n] \neq n ,就無解。
有解的時候,把每一個點對應的極大連續區間向包含它的最小的極大連續區間連邊,這顯然是一棵樹。

對於一個根,它代表了一段連續區間,而它的每一個兒子都分別代表了一個極大的連續區間,那麼把每一個兒子代表的區間縮成一個點,按原相對大小重新編號後不存在除整個區間以外的連續區間。
就相當於求解 1 , 2 , 3 , m + 1 1,2,3\dots,m+1 的方案數( m + 1 m+1 表示兒子的個數,即區間長度),記這個值為 f m f_m

設第 i i 個點的兒子個數是 c n t i cnt_i ,那麼答案就是 i = 1 n f c n t i \prod_{i=1}^n f_{cnt_i}

現在求 f i f_i ,首先給出一個結論 f n = ( n 1 ) f n 1 + i = 2 n 2 ( i 1 ) f i f n i f_n=(n-1)f_{n-1}+\sum_{i=2}^{n-2}(i-1)f_if_{n-i}
這個遞推式可以這樣證明:
我們對於一個滿足條件的排列 a a ,我們令 b a i = i b_{a_i}=i
那麼 b b 中值 i j i\sim j 的下標對應 a i a j a_i\sim a_j ,也就是說 b b 中一段連續區間,就對應了 a a 中一段連續區間,說明 b b 中不存在不經過最大值的連續區間。
那麼 a a b b 一一對應,現在轉化為求滿足 b b 性質的方案數。

考慮從 f n f_n 轉移到 f n + 1 f_{n+1}

  • 從一個合法排列轉移到另一個合法排列,假設原排列是 2 n + 1 2\sim n+1 的一個排列,那麼插入的 1 1 只要不與 2 2 相鄰即可,也就是 ( n 1 ) f n 1 (n-1)f_{n-1}
  • 從一個非法排列轉移到一個合法排列,原排列必須有且僅有一個極大的不包含最大值的連續區間,設長度為 l ( 2 l n 2 ) l(2\leq l\leq n-2)
    這個不合法的區間要在插入一個數後合法,等價於分成兩部分,左右都不存在連續區間的方案數。也就是一個合法排列去掉最大值後的兩邊,方案數即為fl。再考慮這段區間的值域(也就是 [ x , x + l 1 ] [x,x+l-1] )範圍, x > 2 x>2 x + l 1 < n + 1 x+l-1<n+1 ,就有 n l 1 n-l-1 個合法值域。其它部分為 f n l f_{n-l}

於是
f n = ( n 1 ) f n 1 + i = 2 n 2 ( n i 1 ) f i f n i f_n=(n-1)f_{n-1}+\sum\limits_{i=2}^{n-2}(n-i-1)f_if_{n-i}
= ( n 1 ) f n 1 + i = 1 n 2 ( i 1 ) f i f n i =(n-1)f_{n-1}+\sum_{i=1}^{n-2}(i-1)f_if_{n-i}