\(\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\),那麼我們要求剩餘部分沒有這樣的匹配,可以容斥原理解決:
其中乘第二個 \(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}\) 迴圈串的容斥係數,有轉移:
答案為 \(\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\) 對答案貢獻的係數,容易發現這就是:
因此答案就是 \(\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)\) 得到:
因此 \(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(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}}\) 可以這樣推導:
其中 \(\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\) 個。
先考慮沒有欽定位置的情況,直接容斥得到方案數為:
對於 \(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\),那麼所有限制為:
可以對所有 \((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\) 條父親到兒子的邊中:
- 有 \(A\) 個黑 - 黑。
- 有 \(B\) 個黑 - 白。
- 有 \(C\) 個白 - 黑。
- 沒有白 - 白。
資料範圍:\(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