Atcoder 題目選做(三)

DaiRuiChen007發表於2024-05-19

\(\text{By DaiRuiChen007}\)




1. [ARC152E] Xor Annihilation

Problem Link

\(2^n-1\) 個動點,權值為 \(1\sim 2^n-1\) 的排列,對於每個點,設其左右兩邊所有點權異或和分別為 \(L,R\),那麼他會向較大 \(L/R\) 較大的一邊移動,如果 \(L=R\) 則靜止不動。

所有點運動速度一定,如果兩個點相遇那麼他們會合成一個新點,權值為他們的異或和。

在左右無窮點處放兩個權值為 \(x\) 的靜點(\(x\in[0,2^n)\))求有多少 \(x\) 使得最終所有點都靜止。

資料範圍:\(n\le 18\)

注意到權值異或總和為 \(0\),因此設字首異或和為 \(s_i\),那麼 \(i\) 左邊和右邊的點權異或和就是 \(s_{i-1}\)\(s_i\)

那麼如果兩個點 \(i,i+1\) 合成之後相當於刪掉 \(s_i\),這要求 \(s_i\ge s_{i-1}\)\(s_i\ge s_{i+1}\) 且三個數不全相等。

那麼整個排列會不斷操作直到所有 \(s\) 相等或呈單谷。

如果 \(s\) 單谷那麼說明谷低左側的點向左無限運動,必然不合法。

因此我們要使得最終所有 \(s\) 相等,顯然這個相等的值就是 \(\min_{i=1}^n s_i\),那麼這些點能靜止當且僅當 \(s_{\min}\ge x\)

因此我們要計數有多少 \(x\) 使得所有 \(s_i\oplus x\ge x\),這隻要 \(s_i\) 最高位不屬於 \(x\) 即可。

求出所有 \(s_i\) 最高位的並,剩下的位可以隨便選。

時間複雜度 \(\mathcal O(2^n)\)

Submission Link




2. [ARC152F] Attraction on Tree

Problem Link

給定一個 \(n\) 個點的樹,一個動點 \(x\) 初始在 \(1\),找到一個排列 \(p_1\sim p_n\),使得第 \(i\) 步滿足 \(x\ne p_i\) 然後讓 \(x\)\(p_i\) 方向移動一條邊,最終 \(x=n\),最小化過程中 \(x\) 經過的點數。

資料範圍:\(n\le 2\times 10^5\)

顯然最終經過了 \(2k+\mathrm{dis}(1,n)\) 條邊,因此 \(n\not\equiv\mathrm{dis}(1,n)\pmod 2\) 就不合法。

先考慮最小值,即只經過 \(\mathrm{path}(1,n)\) 的方案。

那麼對於路徑上第 \(i\) 個點 \(c_i\),設他在路徑外的子樹大小為 \(\mathrm{siz}(c_i)\)

我們發現很多操作都要在折返中抵消,那麼我們只要欽定鏈上哪些操作最終有用,剩下的操作形成若干跨子樹的匹配,那麼我們一定能構造一個合法的 \(p\)

根據經典結論,那麼我們要求剩下的操作中不存在絕對眾數。

找到最大的 \(\mathrm{siz}(c_i)\),那麼我們至多在他的子樹裡欽定 \(i\) 個沒被抵消。

因此這種情況的充要條件就是 \(\mathrm{siz}(c_i)-i\le\dfrac{n-\mathrm{dis}(1,n)}2\),顯然這樣的 \(i\) 至多一個,因此我們能構造出一個合法的匹配。

否則找到不合法的這棵子樹,列舉一個連通塊 \(S\),記每個連通塊內節點 \(u\) 在連通塊外的子樹大小為 \(\mathrm{siz}(u)\)

那麼我們依然要求 \(\mathrm{siz}(u)-i\le\dfrac{n-\mathrm{dis}(1,n)}2\),證明大致同上。

那麼我們要在這個基礎上保留儘可能少的節點是的所有 \(\mathrm{siz}(u)\) 不超過 \(k=\dfrac{n-\mathrm{dis}(1,n)}2+i\)

注意到 \(\mathrm{siz}(c_i)\le n-\mathrm{dis}(1,n)\le 2k\),因此不合法的所有點構成一條鏈,對於每個點貪心地割掉若干個最大的子樹即可。

時間複雜度 \(\mathcal O(n)\)

Submission Link




3. [ABC273G] Row Column Sums 2

Problem Link

求有多少個 \(n\times n\) 正整數矩陣使得其第 \(i\) 行和是 \(r_i\),第 \(j\) 列和是 \(c_j\)

資料範圍:\(n\le 5000,r_i,c_j\le 2\)

顯然 \(\sum r_i\ne\sum c_j\) 無解,不妨記 \(m=\sum r_i=\sum c_j\)

否則我們可以看成二分圖,\(r_i=0\) 不建點,\(r_i=2\) 拆成兩個點,右部 \(c_j\) 同理,兩個點 \((i,j)\) 匹配表示 \(A_{i,j}\)\(+1\)

但是對於 \(r_i=2,c_j=1,c_k=1\) 此時 \(i_0\to j,i_1\to k\)\(i_0\to k,i_1\to j\) 是同一種方案,因此假設 \(r_i,c_j\) 中分別有 \(x,y\)\(2\),那麼答案要除以 \(2^{x+y}\)

但這並不完全對,假如 \(r_i=2,c_j=2\),且 \((i_0,i_1)\to(j_0,j_1)\),此時只是重複計算了兩倍貢獻但除以了 \(4\),因此對於這樣的匹配要乘回一個 \(2\)

因此我們列舉 \(i\) 表示有多少這樣的 \(r_p=c_q=2\) 且互相匹配,對答案的貢獻就是對應匹配數 \(\times 2^i\),那麼我們要求剩餘部分沒有這樣的匹配,可以容斥原理解決:

\[\mathrm{Ans}=\dfrac{1}{2^{x+y}}\sum_{i=0}^{\min(x,y)} 2^i\binom xi\binom yii!2^i\sum_{j=0}^{\min(x,y)-i}\binom{x-i}j\binom{y-i}jj!2^j(m-2i-2j)! \]

其中乘第二個 \(2^i\) 是這 \(i\)\((p_0,p_1),(q_0,q_1)\) 中每對有兩種匹配方式。

時間複雜度 \(\mathcal O(n^2)\)

Submission Link




4. [ABC273Ex] Inv(0,1)ving Insert(1,0)n

Problem Link

給定 \(n\) 個分數 \(\dfrac{a_i}{b_i}\),記 \(f_{l,r}\) 表示 \(\dfrac{a_l}{b_l}\sim \dfrac{a_r}{b_r}\) 在 Stern-Brocot Tree 上的虛樹大小,求 \(\sum_{1\le l\le r\le n}f_{l,r}\)

資料範圍:\(n\le 10^{5},a_i,b_i\le 10^9\)

先考慮如何求 \(l=r\) 的情況,顯然一個分數的深度可以很大,但是根據經典結論,這條路徑上轉向點至多 \(\mathcal O(\log V)\) 個。

因此對於當前樹上區間 \((\dfrac{a_L}{b_L},\dfrac{a_R}{b_R})\),我們可以求出最大的 \(k\) 使得 \(\dfrac{a_i}{b_i}<\dfrac{ka_L+a_R}{kb_L+b_R}\)\(\dfrac{a_i}{b_i}>\dfrac{a_L+ka_R}{b_L+kb_R}\),這是容易的。

那麼對於這個問題,首先如果 \(\gcd(a_i,b_i)\ne 1\),那麼該分數無法表示,因此 \(f_{l,r}>0\) 的區間不會包含這些點,那麼我們可以把原序列分成若干段,每段分別解決。

我們可以對所有分數建虛樹,對於虛樹上的一條鏈,貢獻次數只和鏈底子樹內包含的分數下標集 \(X\) 有關,只要 \([l,r]\cap X\ne\varnothing\) 那麼這條鏈上每個節點都對 \(f_{l,r}\)\(+1\) 貢獻,可以用啟發式合併動態維護這些下標。

然後遞迴,維護一個分數集合 \(S\),如果 \(S\) 中所有元素都在 \(mid=\dfrac{a_L+a_R}{b_L+b_R}\) 的同一側,那麼根據剛才的做法求出 \(k\) 後直接轉成子問題,否則二分出 \(S\)\(<mid\)\(>mid\) 的兩個子集分別遞迴,然後在當前節點上啟發式合併維護當前節點權值。

時間複雜度 \(\mathcal O(n\log V\log n)\)

Submission Link




*5. [AGC058D] Yet Another ABC String

Problem Link

求有多少 \(a\)\(\texttt A\)\(b\)\(\texttt B\)\(c\)\(\texttt C\) 構成的字串使得不存在子串 \(\texttt{ABC},\texttt{BCA},\texttt{CAB}\)

資料範圍:\(a,b,c\le 10^6\)

\(n=a+b+c\)

考慮容斥,欽定若干個 \(i\) 使得 \(s[i,i+2]\) 不合法,但是此時可能會同時欽定到 \(i,i+1\) 從而導致兩個不合法段拼起來了。

因此我們不妨列舉極長的被欽定不合法的段,先求容斥係數,設 \(p_i\) 表示段長為 \(i\) 時的容斥係數,那麼考慮上一個被欽定的位置有 \(p_i=-p_{i-1}-p_{i-2}\)

邊界條件是 \(p_2=0,p_3=-1\),從而得到 \(p_{3k}=-1,p_{3k+1}=1,p_{3k+2}=0\)\(k>0\))。

列舉每一段的長度,會發現此時的序列形如:若干個被欽定的 \(\texttt{ABC}\) 迴圈串和一些沒限制的字元。

  • 長度為 \(3k\) 的串相當於 \(k\)\(\texttt{ABC}\),但有 \(3\) 種方法選顏色。
  • 長度為 \(3k+1\) 的串相當於 \(k\)\(\texttt{ABC}\) 和一個自由字元。
  • 自由字元可以看成 \(k=0\) 的長度為 \(3k+1\) 的串。

因此設 \(f_{i,j}\) 表示當前字串長度為 \(i\),欽定 \(j\)\(\texttt{ABC}\) 迴圈串的容斥係數,有轉移:

\[f_{i,j}=\sum_{k\ge 0} f_{i-3k-1,j-1}-3\sum_{k\ge 1}f_{i-3k,j} \]

答案為 \(\sum \binom{n-3i}{a-i,b-i,c-i}f_{n,n-3i}\)

考慮如何求 \(f\),用二元生成函式,設 \(F(x,y)=\sum f_{i,j}x^iy^j\),轉移係數為 \(G(x,y)\),那麼 \(F(x,y)=\sum_{k\ge 0} G^k=\dfrac{1}{1-G}\)

其中 \(G(x,y)=\sum_{k\ge 0}x^{3k+1}y-3\sum_{k\ge 1} x^{3k}=\dfrac{xy-3x^3}{1-x^3}\),因此 \(F(x,y)=\dfrac{1-x^3}{1-xy+2x^3}\)

我們只要求 \([x^uy^v]\dfrac{1}{1-xy+2x^3}\) 即可,即 \([x^uy^v]\sum_{i\ge 0}(xy-2x^3)^i\),那麼最終對答案有貢獻的項就是 \((xy)^v(-2x^3)^{(u-v)/3}\),直接計算二項式係數即可 \(\mathcal O(1)\) 計算。

最終答案需要 \(\mathcal O(n)\) 項係數,預處理組合數後直接計算即可。

時間複雜度 \(\mathcal O(n)\)

Submission Link




6. [AGC058E] Nearer Permutation

Problem Link

對於兩個長度為 \(n\) 的排列 \(p,q\),定義它們的距離 \(d(p,q)\) 為:

  • 每次交換 \(p\) 中相鄰兩個元素,使得 \(p=q\) 的最小操作次數。

定義單位排列 \(I=(1,2,\cdots,n)\),定義 \(f(x)\) 為字典序最小的排列 \(z\) 滿足 \(d(x,z)\le d(I,z)\)。例如當 \(n=3,x=(2,3,1)\)\(f(x)=(2,1,3)\)

給定排列 \(q\),判斷是否存在排列 \(p\) 滿足 \(f(p)=q\)

資料範圍:\(n\le 3\times 10^5\)

以下過程排列下標均為均為 \(0\sim n-1\)

先考慮一種求 \(f(p)\) 的演算法:從 \(f(p)=p\) 出發,每次嘗試令字典序最小進行貪心調整:

  • \(s=\mathrm{inv}(p)/2\)
  • 進行如下操作 \(n\) 次:求出 \(\min\{p_0,p_1,\dots,p_s\}=p_k\),把 \(p_k\) 插入答案序列 \(q\) 的末尾並刪除,然後令 \(s\gets s-k\)

這個過程相當於貪心,每次這樣的操作肯定會選取一個字首最小值,而移動該字首最小值對 \(d(p,q)-d(I,q)\)\(-2k\) 的貢獻,因此 \(k\) 的上界就是 \(\mathrm{inv}(p)/2\)

觀察 \(q\) 序列,如果存在某個位置使得 \(q_k>q_{k+1}\)(沒有說明 \(q=I\),顯然 \(f(I)=I\))。

那麼說明 \(q_{k+1}\)\(p\) 排列中一定是等到 \(q_k\) 刪掉後才進入可能被選範圍內。

考慮刪除 \(q_k\) 前的 \(p\) 序列,此時 \(p_{s+1}=q_{k+1}\)\(p_0=q_k\),並且插入 \(q_{k+1}\)\(s=0\),因此 \(q_{k+2}\sim q_n\) 與剩餘的 \(p\) 序列一致。

我們只需調整 \(p_0\sim p_{k-1}\) 使得操作 \(k\) 次後 \(p\) 滿足如上性質即可。

先令 \(q=p\),然後依次考慮 \(q_{k+1},q_{k-1},q_{k-2},\dots,q_0\),每次把當前元素 \(q_i\) 向後移動 \(c\) 位滿足 \(q_{i}\le q_{i+1}\sim q_{i+c}\),若 \(i=k+1\) 則需滿足 \(q_k\le q_{i+1}\sim q_{i+c}\)

我們希望刪除 \(q_{k+1}\) 前其在 \(p\) 中的位置 \(x\) 與當前的 \(s\)\(s-x=y\) 儘可能小。

那麼把 \(q_i\) 向後移動會使得原序列逆序對數 \(+1\),刪除時花費代價 \(+1\),最終使得 \(y\) 減小 \(0.5\)

因此我們要讓 \(\sum c_i=\mathrm{inv}(q)/\mathrm{inv}(q)-1\),貪心讓每次 \(c_i\) 儘可能取最大即可。

時間複雜度 \(\mathcal O(n\log n)\)

Submission Link




*7. [AGC058F] Authentic Tree DP

Problem Link

對於一棵 \(n\) 個點的樹 \(T\),定義 \(f(T)\) 為:

  • \(n=1\)\(f(T)=1\)
  • 否則對於所有 \(e\in T\),設 \(T_{e,1},T_{e,2}\) 為切掉這條邊形成的兩棵子樹,那麼 \(f(T)=\dfrac 1n\sum_e f(T_{e,1})\times f(T_{e,2})\)

給定 \(T\),求 \(f(T)\bmod P\) 的值。

資料範圍:\(n\le 5000\)

看到這個模型,考慮編一個組合意義:在每條邊中間插一個點,那麼 \(f(T)\) 就是隨機排列每個點的標號,使得新加入的點標號都大於其鄰居的方案數。

那麼 \(f(T)\) 的定義相當於列舉最大值所在的位置,但是我們會發現此時的分母為 \(\dfrac 1{2n-1}\),我們需要調整,不妨給加入的每個點下面掛 \(P-1\) 個點,那麼在模意義下分母為 \(\dfrac 1n\)

然後我們可以考慮容斥,把邊大於其父親的限制容斥,那麼所有的限制都形如兒子小於父親,所有事件都獨立,只要維護每個點為根的連通塊大小即可。

轉移時類似樹形揹包,動態列舉每條邊斷不斷即可。

時間複雜度 \(\mathcal O(n^2)\)

Submission Link




8. [ARC153E] Deque Minimization

Problem Link

給定十進位制串 \(X\),記 \(f(X)\) 表示按如下方式能得到的最小十進位制串 \(Y\)

  • 從高到低考慮 \(X\) 的每一位,分別加入 \(Y\) 的首部或尾部。

給定 \(Y\),求有多少 \(X\) 使得 \(f(X)=Y\)

資料範圍:\(|Y|\le 2\times 10^5\)

考慮 \(f(X)\) 的計算過程:顯然對於當前位,如果小於 \(Y\) 的首位就放到隊頭,如果大於 \(Y\) 的首尾就放到隊尾,如果等於 \(Y\) 的首尾,由於放到隊頭的若干個數單調不降,因此放到隊頭也一定更優。

因此我們可以得到一個區間 dp:\(f_{l,r}=f_{l+1,r}\times [Y_l\le Y_{l+1}]+f_{l,r-1}\times[Y_r>Y_l]\)

把整個轉移寫在網格圖上(圖源官方題解):

要求的就是從 \((i,i)\to (1,n)\) 的路徑數量和,注意到很多位置與 \((1,n)\) 不連通。

首先我們發現,如果 \(Y[1,l]\) 不是單調遞增的,那麼 \((l,r)\)\((1,n)\) 不連通。

因此我們要考慮的 \(l\) 一定是字首遞增的一個連續段,這些區域有一個很好的性質,就是所有向上走的轉移(\(f_{l,r}\to f_{l-1,r}\))始終都是存在的,那麼可以考慮倒著維護每一行,即 \(l\) 遞減地維護 \(f_{l,*}\)

暴力轉移肯定不優,不妨嘗試把這段遞增字首中值相同的縮起來,這樣我們就只要處理 \(\mathcal O(|\Sigma|)\) 個連續段了。

對於相同的一段 \(Y_{[a,b]}\),觀察網格圖的形狀:左側是一個只能向上走的階梯,那麼 \(f_{a,a}\sim f_{a,b}=1\)

然後右側是若干連續向右的矩形轉移,直到 \((b,n]\) 中第一個 \(x\) 使得 \(Y_x>Y_b\),那麼 \([b,x)\) 這個範圍內所有 \(f_{l,r}\to f_{l,r+1}\) 的轉移都是存在的。

可以發現 \(f_{[a,b],[x,n]}\) 這個範圍內的值無法被某個 \(f_{i,i}\) 轉移到,也不需要考慮。

那麼我們只要考慮 \(f_{b,[b,x)}\to f_{a,[b,x)}\) 的過程,容易發現這就是進行了 \(k=b-a+1\) 次字首和操作。

根據插板法可以直接算出多次字首和的轉移係數:\(f_{b,i}\to f_{a,j}\) 的係數為 \(\binom{j-i+k-1}{k-1}\),因此直接卷積一遍就能快處理 \(k\) 階字首和。

時間複雜度 \(\mathcal O(|\Sigma|n\log n)\),其中 \(|\Sigma|=9\)

Submission Link




9. [ARC153F] Tri-Colored Paths

Problem Link

給定一張 \(n\) 個點 \(m\) 條邊的無向簡單連通圖,求有多少種給邊染色 \(\{1,2,3\}\) 的方法,使得至少存在一條簡單路徑上有三種顏色。

資料範圍:\(n,m\le 2\times 10^5\)

注意到限制比較松,我們可以考慮染了三種顏色但沒有這樣路徑的方案數。

先考慮樹的情況,取某條極長路徑 \(u\to v\),顯然路徑上只有兩種顏色,不妨假設第三種顏色在樹上某個點 \(w\) 子樹內。

那麼 \(u\to w\) 整個部分不能包括兩種顏色,同理 \(w\to v\) 部分也只能有一種顏色。

因此我們還能證明這樣的 \(w\) 至多一個。

方案數就是 \(\sum f(deg_u)\),其中 \(f(x)=3^x-2^x+3\)

因此對於一棵樹,合法的染色方案一定存在恰好一個節點,使得該節點每個子樹內都染相同顏色。

然後考慮一般情況,先縮點,對每個點雙聯通分量內部討論:

  • 存在一個長度 \(\ge 4\) 的環,此時整個點雙聯通分量只能染同一顏色,否則必然存在一條路徑從任意一個點出發經過兩種顏色,此時這個點往外連第三種顏色即可(手玩可以得出結論)。
  • 否則該點雙連通分量中只有三元環,先假設每條邊顏色各不相同:
    • 手玩發現如果環上存在兩個點 \(u,v\) ,以及環外兩點 \(x,y\) 使得 \(x\to u,y\to v\) 存在(\(x\ne y\))那麼這個環不能染 \(> 1\) 種顏色。
    • 否則分類討論:如果 \(u,v,w\) 都只和 \(\le 1\) 個環外點相連,那麼此時三元環可以染三種顏色,然後環外邊染該點在環上對邊的顏色,恰有 \(6\) 種方案,這種情況只在 \(n=4,m\ge 5\) 時出現。
    • 否則這個點雙一定恰為三元環,且恰有一個點 \(u\) 向外連邊(假設 \(n>3\)),手玩發現三元環必須染三種不同顏色,且環外所有邊必須都染 \(u\) 對邊顏色,也只有 \(6\) 種方案。

否則所有點雙都同色,類似樹的結論,可以在圓方樹上恰取出一個圓點使得其每個子樹染相同顏色。

答案還是 \(\sum f(deg_u)\),但 \(u\) 是圓方樹上所有圓點。

時間複雜度 \(\mathcal O(n+m)\)

Submission Link




10. [ARC154E] Reverse and Inversion

Problem Link

給定一個 \(1\sim n\) 的排列 \(p\)\(m\) 次操作,每次隨機一對 \(1\le l\le r\le n\) 並翻轉 \(p_l\sim p_r\)

對於最終的每個排列 \(q_1\sim q_n\),計算 \(\sum_{i<j} [q_i>q_j](j-i)\)

資料範圍:\(n,m\le 2\times 10^5\)

考慮計算每個 \(i\) 對答案貢獻的係數,容易發現這就是:

\[\begin{aligned} \sum_{j<i}[q_j>q_i]-\sum_{i<j} [q_i>q_j] &=(i-1)-\sum_{j<i}[q_j<q_i]-\sum_{i<j} [q_i>q_j]\\ &=(i-1)-(q_i-1)=i-q_i \end{aligned} \]

因此答案就是 \(\sum i^2-i\times q_i\),第一部分很好統計,我們只需要對於每個 \(p_i\) 求出其最終所在位置的期望。

可以發現對於每個 \(i\),一次操作後使得 \(i\to j\) 的方案數與使得 \(i\to n-j+1\) 的方案數是相等的。

因此對於每個 \(i\),有 \(\left(1-\dfrac{i(n-i)}{n(n+1)/2}\right)^m\) 的機率留在原地,剩下的情況所在位置的期望是 \(\dfrac{n+1}2\)

那麼就可以快速計算每個 \(p_i\) 最終位置的期望。

時間複雜度 \(\mathcal O(n\log P)\)

Submission Link




*11. [ARC154F] Dice Game

Problem Link

給定一個 \([1,n]\) 的隨機變數,對於 \(i\in [1,m]\) 求隨機出 \(1\sim n\) 每個數至少一次的隨機次數的 \(i\) 次方的期望。

資料範圍:\(n,m\le 2\times 10^5\)

假設 \(F(z)\) 為對應的 PGF,即 \([z^k]F(z)\) 表示隨機恰好 \(k\) 次後得到所有面的機率,那麼考察 \(F(e^z)\) 得到:

\[[z^i]F(e^z)=[z^i]\sum_{k=0}^{\infty} f_k\sum_{i=0}^\infty \dfrac{(kz)^i}{i!}=\sum_{k=0}^\infty \dfrac{k^if_k}{i!} \]

因此 \(F(e^z)\) 就是答案的 EGF。

先考慮求 \(F(z)\),從樸素 dp 開始:設 \(f_{i,j}\) 表示隨機 \(j\) 次後已經得到 \(i\) 個數的機率,那麼:\(f_{i,j}=\dfrac inf_{i,j-1}+\dfrac{n-i+1}n f_{i-1,j-1}\),用 \(F_i(z)\) 表示 \(\sum z^jf_{i,j}\) 得到:

\[F_i(z)=z\left(\dfrac in F_i(z)+\dfrac{n-i+1}n F_{i-1}(z)\right)=\dfrac{z(n-i+1)}{n-iz}F_{i-1}(z)=\dfrac{z^in^{\underline i}}{\prod_{j=1}^i(n-jz)} \]

那麼最終的 \(F(z)=\dfrac{z}nF_{n-1}(z)=\dfrac{z^n(n-1)!}{\prod^{n-1}_{i=1}(n-iz)}\),不妨設分母為 \(G(z)\),可以透過分治 NTT 算出。

由於 \(F(z)\) 為無窮級數,並不方便直接帶入 \(F(e^z)\),那麼我們可以把 \(e^z\) 帶入右側得到 \(F(e^z)=\dfrac{e^{zn}(n-1)!}{G(e^z)}\)

\(G(z)\)\(n-1\) 次多項式,求 \(G(e^z)\bmod {z^{m+1}}\) 可以這樣推導:

\[G(e^z)=\sum_{i=0}^{n-1} g_i\sum_{j=0}^m\dfrac{(iz)^j}{j!}=\mathrm{EGF}\sum_{i=0}^{n-1}\dfrac{g_i}{1-iz} \]

其中 \(\mathrm{EGF}\) 運算元表示把 \(i\) 次項係數除以 \(i!\)

而這個函式也可以透過分治 NTT 維護通分後的分子分母。

最後多項式求逆除一下得到 \(G(e^z)\),再求逆除一下得到 \(F(e^z)\) 即可。

時間複雜度 \(\mathcal O(n\log^2n+m\log^2m)\)

Submission Link




12. [ARC155D] Avoid Coprime Game

Problem Link

給定 \(a_1\sim a_n\)\(x=0\),A 和 B 輪流選擇 \(a_i\) 並令 \(x\gets\gcd(x,a_i)\),不能重複用 \(a_i\),誰把 \(x\) 變成 \(1\) 就輸。

對於每個 \(a_i\),求出 A 第一步操作該數後誰會贏。

資料範圍:\(n\le2 \times 10^5\)

注意到 \(x\mid a_i\) 比較麻煩,否則如果每次 \(x\) 嚴格變小,我們可以簡單 dp 求勝負態。

\(f_x\) 表示當前勝負狀態,那麼 \(f_x=\mathrm{OR}\{\overline{f_y}\mid\exists a_i:\gcd(a_i,x)=y\}\),容易證明這一步取的 \(a_i\) 不可能被取過。

判斷是否存在 \(a_i\) 是簡單的,先求每個 \(x\) 的倍數數量,然後從大到小列舉 \(y\mid x\),把 \(y\) 的因子中 \(a_i\) 作為倍數的數量出現次數減去 \(y\) 的倍數的數量。

但是我們現在可能可以不讓 \(x\) 變小,即拖延時間。

我們發現一個人會拖延時間當且僅當 \(f_x=0\),那麼兩個人會拖延時間直到所有 \(x\) 倍數被選完。

那麼我們需要記錄 \(x\) 的倍數已經用了幾個,進一步發現只關心 \(x\) 倍數被選擇個數的奇偶性就行,顯然選擇 \(x\) 的倍數的數量和運算元量相等。

那麼跟上面類似 dp 即可,最後處理拖延時間的情況。

時間複雜度 \(\mathcal O(n\log^2n)\)

Submission Link




*13. [ARC155E] Split and Square

Problem Link

\(S\) 是由 \(n\)\(m\) 位二進位制陣列成的集合,定義 \(f(S)\) 表示 \(\{i\oplus j\mid i,j\in S\}\)

一次操作可以選定 \(T\subseteq S\),使得 \(S\gets f(T)\cup f(S\setminus T)\),求使得 \(S=\{0\}\) 的最小操作次數。

資料範圍:\(n,m\le 300\)

這種問題先考慮 \(S\) 的線性基 \(e_1\sim e_k\),設最終 \(e_1\sim e_s\in T,e_{s+1}\sim e_k\in S\setminus T\)

那麼我們知道 \(f(T)\) 包含 \(e_1\oplus e_2\sim e_1\oplus e_s\),並且他們之間線性無關(任取一個子集顯然異或和不為 \(0\))。

那麼 \(f(T)\) 線性基大小 \(\ge s-1\),同理 \(f(S\setminus T)\) 線性基大小 \(\ge k-s-1\),因此線性基大小每次至多 \(-2\)

然後我們分析每次線性基大小減小的下界,假如我們只想讓新的 \(S\) 線性基大小減一,這是簡單的,把 \(S\) 裡的數唯一表示成 \(e_1\sim e_k\) 的異或和,表示方式中包含 \(e_1\) 的全部放進 \(T\)

那麼容易證明 \(f(T)\cup f(S)\) 的張成空間維度 \(\le k-1\)(可以用 \(e_2\sim e_k\) 表示所有數)。

那麼這樣操作每次線性基大小至少 \(-1\)

再進一步分析:注意到操作一次之後 \(0\in S\),且以後該性質一直成立,不妨假設在操作的時候 \(0,e_1\sim e_k\in T\),那麼 \(f(T)\) 依然滿足這個條件,那麼 \(f(T)\) 的線性基大小 \(\ge k\).

那麼第二次操作以及之後每次操作不可能令 \(f(T),f(S\setminus T)\) 的線性基大小同時 \(-1\),因此每一步都只可能令線性基大小 \(-1\)

那麼我們只要特殊處理第一次操作,我們又發現令 \(S\) 的每個數異或上 \(S_0\)(某個元素)顯然不會影響 \(f(T),f(S\setminus T)\) 的值,那麼這樣我們就又轉化成了 \(0\in S\) 的情況。

因此我們只要求出這個新集合的線性基大小即可,std::bitset 最佳化一下。

時間複雜度 \(\mathcal O\left(\dfrac{nm^2}\omega\right)\)

Submission Link




14. [ARC156D] Xor Sum 5

Problem Link

\(n\) 個值 \(c_1\sim c_n\) 填入 \(a_1\sim a_k\),可以重複(相等的 \(c\) 算不同元素),求所有 \(\sum_{i=1}^k a_i\) 的異或和。

資料範圍:\(n,c_i\le 1000,k\le 10^{12}\)

首先根據 Lucas 定理 \(\binom nm\bmod 2=[m\subseteq n]\),那麼假設我們知道 \(c_1\sim c_n\) 的出現次數 \(b_1\sim b_n\)

那麼對應的方案數 \(\binom{k}{b_1,\dots,b_n}\) 為奇數當且僅當 \(b_1\sim b_n\) 構成了 \(k\) 在二進位制下的一個劃分,即 \(\forall i\ne j,b_i\operatorname{AND}b_j=0\)

那麼我們只要知道每個 \(k\) 的二進位制位被哪個 \(c_i\) 選了即可。

從低到高考慮每一個二進位制位 \(d\),可以直接 \(dp_i\) 記錄前面的位對當前的進位為 \(i\) 的方案數,如果 \(d\in k\) 則列舉 \(a_i\),加入 \(a_i\times 2^d\)

注意 \(2\mid n\) 時如果 \(d\) 小於 \(k\) 的最高位,這些方案數始終是偶數,不能計算貢獻(最高位有 \(n\) 中方案)。

顯然進位數不超過 \(2V\),直接 dp 即可。

時間複雜度:\(\mathcal O(nV\log k)\)

Submission Link




15. [ARC156E] Non-Adjacent Matching

Problem Link

給定 \(n\) 個點 \(1\sim n\),定義一張圖是好的需要滿足:

  • \((1,2),(2,3),\dots,(n,1)\) 之間沒有邊。
  • 每個點度數 \(\le m\)
  • 所有點度數和 \(\le k\)

求有多少 \(x_1\sim x_n\) 可以作為一張好圖的度數序列。

資料範圍:\(n,m\le 3000,k\le nm\)

\(S=\sum_{i=1}^n x_i\),一組序列合法當且僅當:

  • \(2\mid S,S\le k\)
  • \(\forall i\in [1,n]\) 滿足 \(x_i+x_{i+1}\le S/2\)
  • \(\forall i\in[1,n]\) 滿足 \(x_i\in[0,m]\)

可以驗證這就是合法的充要條件,構造每次取一個 \(x_i+x_{i+1}=S/2\) 的點和任意一個其他的點連起來即可。

然後考慮對這樣的序列計數。

我們容斥列舉 \(x_i+x_{i+1}>S/2\) 的位置數,容易證明不滿足的位置 \(\le 2\) 個。

先考慮沒有欽定位置的情況,直接容斥得到方案數為:

\[\sum_{S=0}^k[2\mid S]\sum_{i=0}^n(-1)^i\binom ni\binom{S+n-1-(m+1)i}{n-1} \]

對於 \(S\in[0,k]\),最後一個式子是若干組合數的字首和,對上指標奇偶性分類即可。

然後考慮欽定一個位置的情況:

列舉這兩個位置的和 \(t\),暴力列舉這兩個位置的所有分配,那麼剩餘位置的和 \(<t\)\(\le k-t\)

dp 預處理求出 \(n-2\)\([0,m]\) 中變數湊出 \(<t\) 的方案總和,容易發現 \(t\le 2m\),因此字首和最佳化 dp,時間複雜度為 \(\mathcal O(nm)\)

由於還要欽定具體位置,所以最後答案記得 \(\times n\)

對於欽定兩個位置的情況,容易發現這兩個位置一定相鄰。

設對應的三個元素分別為 \(x,t,y\),剩餘部分的和為 \(s\),那麼所有限制為:

\[\begin{cases} x+t<y+s\\ t+y<s+x\\ x+s+t+y\le k\\ 2\mid x+s+t+y \end{cases} \implies \begin{cases} |y-x|<t-s\\ y+x\le k-t-s\\ y+x\equiv t-s \pmod 2 \end{cases} \]

可以對所有 \((x,y)\) 二維字首和出數量,列舉 \(s,t\) 即可,對於剩下 \(n-3\) 個元素的方案同樣用 dp 出來的結果即可。

這一部分的答案也要記得 \(\times n\)

時間複雜度 \(\mathcal O(k+nm)\)

Submission Link




16. [ARC156F] Make Same Set

Problem Link

給定 \(a_1\sim a_n,b_1\sim b_n,c_1\sim c_n\)

對於每個 \(i\)\(a_i/b_i\) 加入 \(S\)\(a_i/c_i\) 加入 \(T\),求最大的 \(|S|\) 使得 \(S=T\) 並輸出方案。

資料範圍:\(n\le 5000\)

先考慮可以不加入 \(a_i/b_i\)\(a_i/c_i\) 的情況,這相當於類似三分圖匹配的模型,建網路流即可解決。

不妨猜測這個問題的答案就是最終問題的答案。

顯然答案不可能更大,我們只要保證 \(|S\cap T|\) 不變,然後使得 \(S,T\) 對稱差變成 \(0\)

我們考慮調整法:

  • 如果 \(a_i\in S,a_i\not\in T,b_i\in T\)\(b_i\in S\) 也同理),直接令 \(b_i\) 加入 \(S\),顯然 \(a_i\not\in S\cap T\),那麼此時對稱差變小,是一種合法的調整。
  • 否則對於任意 \(a_i\not\in T\iff b_i\not\in T\),顯然 \(c_i\in T\),此時令 \(a_i\) 同時加入 \(S,T\)
    • 如果 \(c_i\in S\),那麼 \(S\cap T\) 不變,下一次操作可以調整掉 \(c_i\) 使得對稱差變小。
    • 否則 \(S\cap T\) 變大,對稱差變小。

那麼我們只要 \(\mathcal O(n)\) 次調整即可。

時間複雜度 \(\mathcal O(n^2)\)

Submission Link




17. [ARC157E] XXYX Binary Tree

Problem Link

給你一棵二叉樹(兒子數 \(0/2\)),你需要給每個點黑白染色,使得對於 \(n-1\) 條父親到兒子的邊中:

  1. \(A\) 個黑 - 黑。
  2. \(B\) 個黑 - 白。
  3. \(C\) 個白 - 黑。
  4. 沒有白 - 白。

資料範圍:\(n\le 10^4\)

首先所有白色都是獨立集,因此有 \(B/B+1\) 個白點(根據根的顏色決定)。

並且每個白點對 \(C\) 的貢獻都是 \(0\)\(2\),因此有 \(\dfrac{C}2\) 個非葉節點。

因此我們要找一個獨立集包含 \(B\) 個點和 \(B-\dfrac C2\) 個葉子,或者 \(B+1\) 個點和 \(B-\dfrac C2+1\) 個葉子。

那麼我們可以 dp,設 \(f_{u,i}\) 表示 \(u\) 子樹選 \(i\) 個葉子,獨立集最大是多少,轉移直接樹形揹包。

時間複雜度:\(\mathcal O(n^2)\)

Submission Link




*18. [ARC157F] XY Ladder LCS

Problem Link

給定兩個長度為 \(n\) 的 01 串 \(s,t\),你可以交換若干對 \((s_i,t_i)\),最大化 \(\mathrm{LCS}(s,t)\) 並輸出之,如有多解輸出字典序最小的一個。

資料範圍:\(n\le 50\)

首先對於每一對匹配的 \(s_i,t_j\),可以透過交換 \((s_i,t_i),(s_j,t_j)\), 使得所有 \(i>j\)

那麼我們有一個暴力的做法:維護 \(dp_{i,Q}\),表示考慮到了 \(s[1,i]\),設最後一次匹配是 \(s_j,t_k\),那麼 \(t[k+1,i]=Q\)

轉移時列舉是否交換,是否匹配,如果把當前的 \(s_i\) 匹配了,那麼就從 \(Q\) 的前面開始往後找,找到第一個 \(Q_p=s_i\),然後刪掉 \(Q[1,p]\)

這樣複雜度是 \(\mathcal O(n2^n)\) 的,難以透過。

觀察到答案看起來比較大,事實上可以透過暴力列舉證明對於連續的 \(3\) 個位置,無論他們怎麼排序,都有一種操作方式使得他們的 \(\mathrm{LCS}\ge2\)

因此答案 \(\ge 2\left\lfloor\dfrac n3\right\rfloor\),因此 \(|Q|\ge \left\lceil\dfrac n3\right\rceil\) 一定不是最優解,那麼此時狀態數就最佳化到了一個可以接受的範圍。

根據題目的要求,我們要按長度為第一關鍵字,字典序為第二關鍵字比較資訊,顯然 可以在最高位前面加一個 \(1\) 作為符號位,那麼符號位越高說明長度越大,為了求字典序最小值,把其他位 01 翻轉即可,同理 \(Q\) 也能這麼表示。

時間複雜度:\(\mathcal O(n2^{n/3})\)

Submission Link




*19. [Hitachi20F] Preserve Diameter

Problem Link

給定一棵 \(n\) 個點的樹 \(T\),求有多少種在樹上加邊的方式使得得到的新圖 \(G\)

  • 無重邊自環。
  • 直徑長度不變。
  • 對於任意一對未連線的點對,連邊後圖的直徑都會變小。

求合法 \(G\) 的數量。

資料範圍:\(n\le 2\times 10^5\)

首先我們發現,如果 \(G\) 中直徑不唯一,我們可以透過縮短某條直徑的不重合部分保證答案不變,因此原圖直徑必須唯一。

考慮 \(G\) 中的直徑 \(s,t\),建立以 \(s\) 為根的 BFS 樹,那麼這個圖合法當且僅當沒有與 \(t\) 同層的其他點,並且所有連線相鄰層或同層的點都已被連線。

因此一組合法的 \(\mathrm{dis}(s,1)\sim \mathrm{dis}(s,n)\) 與一個 \(G\) 構成雙射。

我們發現一組 \(dis\) 合法當且僅當 \(\forall (u,v)\in T:|dis_u-dis_v|\le 1\),因此暴力列舉每條邊的權值,dp 時維護 \(u\) 子樹內有沒有深度為 \(dis_t-dis_u\) 的點即可,當然我們的限制是至少一個,因此還要記錄值是 \(0/1/\ge 2\),轉移時列舉 \(dis_u-dis_v\in\{-1,0,1\}\) 即可。

但我們這樣解決問題還要列舉直徑起點,比較好的想法是列舉直徑中點,然後 dp 時維護子樹內深度為的 \(dis_t-dis_u,dis_u-dis_t\) 兩種點分別有多少,兩側分別取出恰好一個點作為直徑端點。

對於直徑長度為奇數的邊,把這條邊切掉形成兩棵子樹分別 dp 即可。

時間複雜度 \(\mathcal O(n)\)

Submission Link




20. [ABC274Ex] XOR Sum of Arrays

Problem Link

給定 \(x_1\sim x_n\)\(q\) 次詢問 \(x[a,b]\oplus x[c,d]\)\(x[e,f]\) 的字典序大小關係(兩個序列的異或定義為所有元素對位異或)。

資料範圍:\(n\le 5\times 10^5,q\le 5\times 10^4,x_i\le 10^{18}\)

顯然只要求出最大的 \(k\) 使得 \(x[a,a+k-1]\oplus x[c,c+k-1]\oplus x[e,e+k-1]=0\) 即可。

那麼我們自然考慮設計一個雜湊函式維護這個過程,但普通的字串雜湊函式不支援異或,即 \((a_i\times B)\oplus (a_j\times B)\ne (a_i\oplus a_j)\times B\),即 \(\times\)\(\oplus\) 沒有分配律。

注意到異或又能看成二進位制下不進位加法,且乘法對加法有分配律,那麼我們要單獨看這個二進位制數的每一位,可以用向量來看待,因此我們可以設計矩陣來描述雜湊函式資訊。

\(k=\log_2V\),那麼把所有 \(a_i\) 看成 \(k\) 維 01 向量,而 \(B\) 看成一個 \(k\times k\) 的 01 矩陣,在 \(\bmod\ 2\) 意義下做矩陣加乘,此時 \(\oplus\)\(+\) 等價,故具有分配律。

\((\oplus,\mathrm{AND})\) 矩陣乘法可以用位運算最佳化到 \(\mathcal O(k^2)\),矩陣乘向量可以最佳化到 \(\mathcal O(k)\)

而在構造出雜湊函式後,我們可以用倍增解決原問題,直接維護所有 \(a[i,i+2^k-1]\) 的雜湊值即可。

時間複雜度 \(\mathcal O(nK\log N)\)

Submission Link

相關文章