\(\text{By DaiRuiChen007}\)
1. [AGC059C] Guessing Permutation for as Long as Possible
Problem Link
給定 \(\dfrac{n\times (n-1)}2\) 個 \([1,n]\) 中的二元對的順序,求有多少個 \(n\) 階排列 \(P\) 使得按順序詢問到每個 \((u,v)\) 之前無法確定 \(P_u,P_v\) 大小關係。
資料範圍:\(n\le 400\)。
考慮一個詢問 \((u,v)\) 時間為 \(w\),那麼在 \(1\sim w-1\) 範圍內不能有 \(u\to v\) 或 \(v\to u\) 路徑。
手玩可以發現大部分這樣的路徑長度都為 \(2\),即 \(u\to x\to v\) 存在。
否則不妨考慮路徑的一部分 \(u\to x\to y\to\cdots\to v\):此時如果 \((u,y)\) 之間的邊權也 \(<w\) 那麼就可以縮邊,否則 \(u\to y\) 這條邊也會導致排列非法。
那麼我們只要對於所有 \(\max(t_{u,x},t_{x,v})<t_{u,v}\) 保證 \((u,x)\) 和 \((x,v)\) 不同向。
建立 2-SAT 後統計解數量即可,這個 2-SAT 只有相同或不同關係,可以直接並查集。
設 2-SAT 圖聯通塊數量為 \(k\),那麼答案就是 \(2^{k/2}\)。
時間複雜度 \(\mathcal O(n^2\alpha(n))\)。
Submission Link
2. [AGC059D] Distinct Elements on Subsegments
Problem Link
給定一個長度為 \(n+k-1\) 序列 \(a\) 所有長度為 \(k\) 的子區間的顏色數 \(b_1\sim b_n\),構造原序列或報告無解。
資料範圍:\(n,k\le 2\times 10^5\)。
顯然考慮差分 \(b_{i+1}-b_i\),顯然我們只關心 \(a_{i+k}\) 在 \(a_{[i+1,i+k-1]}\) 中是否出現過,以及 \(a_i\) 是否在 \(a_{[i+1,i+k-1]}\) 中出現過。
分別記為 \(l_{i+k},r_i\),那麼 \(b_{i+1}=b_i+r_i-l_{i+k}\)。
考慮如何刻畫 \(l,r\),對於所有值相同的下標,我們把下表距離 \(<k\) 的匹配起來,那麼右邊的數 \(l_i=1\),左邊的數 \(r_j=1\)。
那麼存在一種排列 \(p_1\sim p_m\) 使得 \(l_{i}-r_{p_i}\in[1,k)\)。
透過觀察可以猜測我們在 \(l,r\) 同時升序時取得一個最優的匹配。
然後考慮透過 \(l,r\) 構造原排列:如果 \(l_i=0\),那麼取一個新的值,否則取對應的 \(a_{r_i}\) 的值即可,容易證明所有條件全部滿足。
我們只要構造一組合法的 \(\{l_i\},\{r_i\}\) 即可。
顯然 \(b_{i+1}-b_i\in\{1,-1,0\}\),如果 \(b_{i+1}-b_i\ne 0\) 那麼 \(l_{i+k},r_i\) 直接確定,否則我們要考慮 \(l_{i+k},r_i\) 同時取 \(1\) 還是 \(0\)。
容易猜測取 \(l_{i+k}=r_i=1\) 時更優,可以證明錯位之後一定不會更劣,當且僅當 \(b_{i}=k\) 時不能取 \(l_{i+k}=r_i=1\)。
最後只有 \(l_{[1,k]}\) 和 \(r_{[n,n+k-1]}\) 未處理,而他們的唯一限制就是 \(b_1=k-\sum_{i=1}^k l_i\) 和 \(b_n=k-\sum_{i=n}^{n+k-1} r_i\)。
那麼貪心來說肯定把 \(l,r\) 取靠近中間值(\(l_i\) 往右,\(r_i\) 往左)即可。
時間複雜度 \(\mathcal O(n+k)\)。
Submission Link
3. [AGC059E] Grid 3-coloring
Problem Link
給定 \(n\times n\) 矩陣 \(C\),其最外圈的 \(4n-4\) 個格子已經被 \(3\) 染色,問中間部分能否 \(3\) 染色。
資料範圍:\(n\le 2\times 10^5\)。
題目的限制我們可以看成一個 \(n\times n\) 的矩陣 \(A\),相鄰元素差 \(\in\{1,-1\}\),然後把這個矩陣 \(\bmod 3\) 得到的結果,可以證明固定 \(a_{1,1}=c_{1,1}\) 後總有唯一的 \(A\) 與 \(C\) 對應 。
對於最外圈的值,還原 \(C\to A\) 是簡單的:從任意一個點出發,鄰居和他的 \(+1/-1\) 關係是確定的。
如果這個環最終相鄰元素差 \(\ne 0\) 顯然無解。
進一步的還有顯然的限制:\(|a_{i,j}-a_{u,v}|<|i-j|+|u-v|\)。
對於這個問題,顯然我們只要考慮對邊上的兩個點,並且只要考慮 \((a_{i,1},a_{i,n})\) 之間的關係,因為同一行的 \(|a_{i,1}-a_{j,1}|<|i-j|\) 顯然成立。
可以證明滿足這兩個條件後總能從外圈構造出合法矩陣:
首先能夠證明 \(a_{i,j}\) 在四個邊界上取值不變。
然後對於任意兩個鄰居,容易發現每個元素變化量 \(\in[-1,1]\) 且奇偶性全部變化。
那麼可以證明相鄰兩個數差一定 \(\in\{-1,1\}\)。
因此只要判斷能否成環和對邊是否滿足條件。
時間複雜度 \(\mathcal O(n)\)。
Submission Link
*4. [AGC059F] LIDS
Problem Link
求有多少 \(n\) 階排列 \(p\) 滿足 \(\mathrm{LIS}(p)+\mathrm{LDS}(p)=n+1\) 且 \(p_x=y\)。
資料範圍:\(n\le 5\times 10^6\)。
先考慮只有第一個條件的情況,考慮用楊表刻畫:那麼該排列對應的楊表就是隻有一行一列的楊表,可以根據鉤長公式算出結果,然後把兩個同形態楊表和一個排列雙射得到:
考慮另一種方法刻畫這些排列:
畫出一個 \(n\times n\) 網格,那麼不在邊界上的格線橫縱各 \(n-1\) 條。
選定一個 \(k\) 和分別 \(k\) 條橫縱格線,按橫格線從上到下,縱格線從左到右的順序匹配,得到 \(k\) 個匹配相交格點(記為紅格點)。
對於剩下的 \(n-k-1\) 條橫縱格線,按橫格線從上到下,縱格線從右到左的順序匹配,得到 \(n-k-1\) 個匹配相交格點(記為黑格點)。
對於一個紅格點,如果其左上部分沒有黑格點,那麼染紅他左上方的格子,如果其右下部分沒有黑格點,那麼染紅他右下方的格子。
對於一個黑格點,如果其左下部分沒有紅格點,那麼染黑他右下方的格子,如果其右上部分沒有紅格點,那麼染黑他右上方的格子。
如果有 \(<n\) 個格子被染色,可以證明一定是 \(n-1\) 個格子被染色,把剩下來的一行一列的交點染色。
一種可能的操作方式如下圖:
透過觀察和手玩可以證明如下事實:
- 紅格子縱座標遞減,黑格子座標遞增。
- 紅格點構成的折線和黑格點構成的折線至多一個交點。
- 最後一步前有恰好 \(n-1/n\) 個格子被染色。
- 對應生成的排列 \(\mathrm{LIS}+\mathrm{LDS}=n+1\)。
- 任何一個合法的排列都能還原成這樣的一個矩陣。
那麼我們就把 \(\mathrm{LIS}+\mathrm{LDS}=n+1\) 的排列和在網格圖中選一些格線的過程形成了一個雙射(容易驗證兩者總方案數相等)。
那麼考慮有多少種方法使得 \((x,y)\) 這個格子被染色。
假如該格子被左上方的紅格點染色。
那麼不妨假設前 \(x-1\) 條橫線和 \(y-1\) 條豎線共選了 \(i\) 個(包含第 \(x/y\) 條)。
那麼我們要使得右下方沒有黑格子,那麼右側 \(n-x\) 條橫格線至多有 \(y-1-i\) 個未被選中,同理下方 \(n-y\) 條縱格線至多有 \(x-1-i\) 個未被選中。
那麼右下方至少要選擇 \(n-x-y+i+1\) 個紅色格點,可以透過組合數字尾和求出。
類似如果我們要讓 \((x,y)\) 被右下方紅格點染色,我們可以直接對稱網格令 \((x,y)\gets(n-x+1,n-y+1)\) 然後再做一遍上面的過程即可。
然後考慮 \((x,y)\) 四個鄰居全部未被染色,\((x,y)\) 是最後一步覆蓋到的點。
那麼這要求紅格點都在 \((x,y)\) 左上或右下,黑格點都在 \((x,y)\) 左下或右上。
即在上面的基礎上要求右下方恰好選擇 \(n-x-y+i+1\) 個紅色格點,為了防止算重,我們可以欽定在前一種情況中右下方紅色格點數 \(\ge n-x-y+i+2\)。
那麼依次計算組合數即可。
時間複雜度:\(\mathcal O(n)\)。
Submission Link
5. [ABC275G] Infinite Knapsack
Problem Link
給定個 \(n\) 個物品,每種無窮多個,有兩維代價 \(a_i,b_i\) 和收益 \(c_i\),\(f(x)\) 表示 \(\sum a_i,\sum b_i\) 分別 \(\le x\) 的情況下最大的 \(\sum c_i\),求 \(\lim_{x\to+\infty}\dfrac{f(x)}x\)。
資料範圍:\(n\le 2\times 10^5\)。
先求出每種物品的“價效比”\(x_i=\dfrac{a_i}{c_i},y_i=\dfrac{b_i}{c_i}\),以及每種物品的佔比 \(p_i\),其中 \(\sum p_i=1\)。
那麼答案可以表示為 \(\max(\sum x_ip_i,\sum y_ip_i)^{-1}\),感性理解就是想要 \(1\) 的收益,\(a\) 類體積為 \(\sum x_ip_i\),\(b\) 類體積為 \(\sum y_ip_i\)。
那麼我們只要求 \(\max(\sum x_ip_i,\sum y_ip_i)\) 的最小值,二分一個 \(k\),由於 \(\sum p_i=1\),因此我們只要求 \(\sum (x_i-k)p_i,\sum(y_i-k)p_i\le 0\)。
如果存在 \(i\) 使得 \(x_i,y_i\le k\) 那麼取 \(p_i=1\) 即可。
考慮把這些向量畫在二維平面上,那麼很自然的發現我們只要最靠近第三象限的兩個向量(二、四象限各一個)。
具體來說就是 \(x_i<k\) 且 \(\dfrac{y_i-k}{k-x_i}\) 最小和 \(y_i<k\) 且 \(\dfrac{x_i-k}{k-y_i}\) 最小。
判斷這些向量過第三象限得到那個夾角是否 \(\le \pi\) 即可,也可以直接看成 \(n=2\) 的問題,解一元一次不等式組解決。
時間複雜度 \(\mathcal O(n\log V)\)。
Submission Link
6. [ABC275Ex] Monster
Problem Link
給定 \(a_1\sim a_n,b_1\sim b_n\),令 \(a_{[l,r]}\) 區間 \(-1\) 的代價是 \(\max b_{[l,r]}\),求令所有 $a_i\le0 $ 的最小代價。
資料範圍:\(n\le 10^5,a_i,b_i\le 10^9\)。
考慮線性規劃,設 \(x_{l,r}\) 表示操作 \([l,r]\) 執行了幾次:
設對偶變數為 \(y_1\sim y_n\),線性規劃對偶得到:
這就相當於可以選擇若干 \(a_i\),但 \([l,r]\) 總共不能選擇超過 \(\max b_{[l,r]}\) 個數,求最大權值。
看到區間最大值很自然想到笛卡爾樹,我們發現有意義的限制一定是笛卡爾樹上的極大區間,那麼我們只要限制每個 \(u\) 在笛卡爾樹的子樹內至多選 \(b_u\) 個點。
那麼就可以樹形 dp 了,\(f_{u,i}\) 表示 \(u\) 子樹選 \(i\) 個點的最大答案,初始 \(f_{u,i}=i\times a_u\),然後和 \(f_{ls},f_{rs}\) 作 \((\max,+)\) 卷積,最後保留前 \(b_u\) 項。
注意到 \(f_u\) 初始為一條直線,那麼若干次卷積之後一定還是斜率遞增的凸殼。
可以用閔可夫斯基和維護,每次歸併差分陣列,注意到初始態每個點差分陣列都是相同的一段,把所有斜率相同的連續段用優先佇列存下來,轉移時先啟發式合併,然後彈掉最小的若干段使得總長 \(\le b_u\) 即可。
時間複雜度 \(\mathcal O(n\log^2n)\)。
Submission Link
7. [AGC060C] Large Heap
Problem Link
給定 \(n\),隨機生成一個深度為 \(n\) 的小根堆,權值為 \(1\sim 2^n-1\) 的排列。
求第 \(a\) 層最左邊節點 \(u\) 值小於第 \(b\) 層最右邊節點的值 \(v\) 的機率。
資料範圍:\(n\le 5000\)。
先考慮有多少個深度為 \(n\) 的小根堆,最小值顯然在根上,然後只要把 \(2^n-2\) 個數均分到左右子樹裡,有遞推關係:
考慮如何用類似的過程解決原本的問題:我們把 \(u,v\) 到根的路徑分別取出來,並設兩個指標 \(x=u,y=v\),我們只需要維護 \(V=\mathrm{subtree}(x)\cup\mathrm{subtree}(y)\) 之內的大小關係。
每次我們取出 \(fa(x),fa(y)\) 中較大的一個(不妨設是 \(x\)),然後把 \(x\) 的兄弟的值域和 \(V\) 的值域合併一下即可。
那麼考慮用 dp 維護這個過程,\(dp_{i,j}\) 表示當前 \(x\) 子樹深度為 \(i\),\(y\) 子樹深度為 \(j\) 的合法機率,對應的方案數 \(F_{i,j}=dp_{i,j}\times f_i\times f_j\times \binom{2^i+2^j-2}{2^i-1}\)。
轉移時列舉上一步加入的是 \(x\) 還是 \(y\),然後把新的子樹和原本值域合併一下:
展開所有組合數並化簡可以得到:
邊界條件 \(dp_{n-a-1,\ge n-b}=1\),轉移之前 \(\mathcal O(n^2)\) 預處理所有逆元即可。
時間複雜度 \(\mathcal O(n^2)\)。
Submission Link
8. [AGC060D] Same Descent Set
Problem Link
求有多少個 \(n\) 階排列對 \((p,q)\) 使得 \((p_{i+1}-p_i)(q_{i+1}-q_i)>0\) 恆成立。
資料範圍:\(n\le 2\times 10^5\)。
定義排列 \(p\) 的 Descent Set 為 \(D(p)=\{i\mid p_i>p_{i+1}\}\)。
設 \(f(S)\) 表示 \(D(p)=\overline S\) 的排列數,\(g(S)\) 表示 \(\overline{D(p)}\subseteq S\) 的方案數,即欽定 \(\overline S\) 中的元素一定是 Descent 的。
那麼設 \(g(S)=\{s_1,s_2,\dots,s_k\}(s_i<s_{i+1})\),那麼 \(\overline S\) 中的元素構成若干連續段,每個連續段內都是嚴格遞減的,我們只需要把 \(n\) 個元素分到每個連續段內即可 \(g(S)=\dfrac{n!}{s_1!(s_2-s_1)!\cdots(n-s_k)!}\)。
根據容斥原理我們有 \(f(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|}g(T)\),化簡一下答案:
最後幾步的組合意義是:已知 \(T_1,T_2\),滿足 \(T_1\cup T_2\subseteq S\) 的 \(S\) 只有 \(2^{n-1-|T_1\cup T_2|}\),然後容斥原理拆開化簡。
根據 \(g(T)\) 的組合意義,我們可以看成先列舉 \(Q\subseteq T_1\cap T_2\),把 \(1\sim n\) 劃分成若干段,然後每一段內用 \(T_1\) 和 \(T_2\) 分別切割一遍,切割的段長為 \(k\),那麼就有一個 \(\dfrac{1}{-2k!}\) 的係數。
注意到此時一個 \(T_1\cap T_2\) 的每個子集都會算一次 \((T_1,T_2)\) 的貢獻,此時總貢獻恰好為 \(2^{|T_1\cap T_2|}\)。
因此設 \(g_i\) 表示單個 \(T\) 分 \(i\) 階排列的答案,那麼 \(g_i=\sum_{j<i}\dfrac{g_j}{-2(i-j)!}\)。
設 \(f_i\) 表示 \(i\) 階排列的答案,那麼 \(f_i=\sum_{j<i} f_jg^2_{i-j}\)。
答案為 \(2^{n+1}n!^2f_n\),兩次分治 NTT 計算即可。
時間複雜度 \(\mathcal O(n\log^2n)\)。
Submission Link
*9. [AGC060E] Number of Cycles
Problem Link
記 \(f(p)\) 表示排列 \(\{p_i\}\) 形成的環數。
給定 \(n\) 階排列 \(a\),構造排列 \(b\) 使得 \(f(b)+f(b\circ a)=k\)。
資料範圍:\(n\le 2\times 10^5\)。
設 \(c=b\circ a\),觀察到交換 \(b_i,b_j\) 同時也會交換 \(c_i,c_j\)。
因此 \(f(b)+f(c)\) 的單次變化量一定是偶數(\(\pm 2\) 或 \(0\))。
先考慮 \(f(b)+f(c)\) 的最大值:猜測在 \(b_i=i\) 時取得,此時最值為 \(n+f(a)\),事實上這是可以證明的:
假設最大值在 \(f(b)<n\) 時取得,那麼每次交換 \(b_i,b_j\) 使得 \(f(b)\) 變大,\(f(b)+f(c)\) 一定不降,那麼一定有一組最大值在 \(b_i=i\) 時取得。
因此 \(k\) 的奇偶性不同於 \(n+f(a)\) 或者 \(>n+f(a)\) 一定無解。
接下來考慮 \(f(b)+f(c)\) 的最小值,顯然理論最小值是 \(2\),嘗試構造:
- 對於每個 \(i\),選擇一個沒有入度的 \(j\) 使得當前 \(j,i\) 在當前 \(b\) 中不連通,且 \(p_j,i\) 在當前 \(c\) 中不連通。
- 注意到這樣的操作至多導致兩個 \(j\) 不能選,因此對於 \(1\le i\le n-2\),這樣的 \(j\) 總是存在。
- 對於 \(i=n-1\),我們至少可以選一個 \(j\) 使得 \(j,i\) 在當前 \(b\) 中不連通,這一步至多導致 \(+1\) 個環。
- 對於 \(i=n\) 至多導致 \(+2\) 個環。
因此 \(f(b)+f(c)\) 的最小值 \(\le 3\),那麼最小值為 \(2/3\),根據 \(n+f(a)\) 的奇偶性可以決定。
此時 \(f(b)=1\),考慮每次操作令 \(f(b)\gets f(b)+1\),那麼 \(n-1\) 步之後 \(f(b)+f(c)\) 會取到最大值,且每次變化量 \(\in\{0,2\}\)。
設 \(2\mid n+f(a)\),那麼這個過程中的 \(f(b)+f(c)\) 會取遍 \([2,n+f(a)]\) 中所有偶數,即 \(k\) 的所有可能值。
那麼我們只要在這 \(n-1\) 個排列中找到一個 \(b\) 滿足 \(f(b)+f(c)=k\)。
注意到每次 \(f(b)+f(c)\) 單調不降,二分操作次數判斷 \(f(b)+f(c)\) 與 \(k\) 的關係即可。
時間複雜度 \(\mathcal O(n\log n)\)。
Submission Link
*10. [AGC060F] Spanning Trees of Interval Graph
Problem Link
給定若干 \([1,n]\) 的子區間,其中區間 \([l,r]\) 共有 \(c_{l,r}\) 個,每個區間對應一個節點,兩個節點連邊當且僅當他們對應的區間有交,求這張圖的生成樹個數。
資料範圍:\(n\le 400\)。
設共有 \(m\) 個區間,第 \(i\) 個為 \(S_i=[l_i,r_i]\),記 \(G_{i,j}=[S_i\cap S_j\ne\varnothing],D_{i,i}=\sum_j G_{i,j}\)。
設 \(G,D\) 分別表示對應矩陣刪掉第一行第一列後的結果,那麼根據矩陣樹定理,答案就是 \(\det(D-G)\)。
注意到這裡我們考慮了自環的貢獻,但是此時 \(G_{i,i},D_{i,i}\) 各多算了 \(1\),相減後無影響。
顯然直接維護該行列式不太可能。
考慮矩陣行列式引理:\(\det(A+uv^T)=\det A(1+v^TA^{-1}u)\),其中 \(A\) 可逆,\(u,v\) 是 \(1\times n\) 向量。
事實上對於 \(u,v\) 為 \(k\times n\) 矩陣時,該引理也成立,我們有 \(\det(A+uv^T)=\det A\det(I+v^TA^{-1}u)\),其中 \(I\) 為 \(k\) 階單位矩陣。
帶入原題,我們要分解 \(G=uv^T\),然後把答案變成 \(\det D\det(I-v^TD^{-1}u)\),其中 \(D\) 是對角線矩陣,因此求逆和求值都是簡單的。
因此我們只要解決分解問題即可。
注意到 \(G_{i,j}=[S_i\cap S_j\ne\varnothing]\),注意到 \(S_i\cap S_j\) 是一個區間,而判斷一個區間是否為空可以看成區間內點數減去邊數。
那麼我們用 \(2i-1\) 表示第 \(i\) 個點,\(2i\) 表示 \([i,i+1]\) 這條邊。
那麼對於 \(i\in S_j,u_{2i-1,j}=v_{2i-1,j}=1\),對於 \(\{i,i+1\}\in S_j,u_{2i,j}=1,v_{2i,j}=-1\),此時 \(k=2n-1\)。
此時暴力求行列式的複雜度為 \(\mathcal O(n^3)\) 可以接受,我們只要算出矩陣 \(T=v^{-1}D^{-1}u\) 即可。
考慮每個區間 \([l,r]\),那麼 \(\det D=\prod_{l,r}d_{l,r}^{c_{l,r}}\),而該區間對 \(T_{i,j}\) 的貢獻就是 \(\dfrac{c_{l,r}}{d_{l,r}}\times(-1)^{j-1}\),要求 \(i,j\in[2l-1,2r-1]\)。
可以看成有 \(c_{l,r}\) 條 \(i\to j\) 的邊,其中走到 \(j\) 的邊自帶符號 \((-1)^{j-1}\),又有一個邊權 \(\dfrac{1}{d_{l,r}}\)。
每個區間對 \(T_{[2l-1,2r-1],j}\) 都修改都是相同的,可以直接差分,而 \(d_{l,r}\) 可以直接前字尾和求出。
時間複雜度 \(\mathcal O(n^3)\)。
Submission Link
11. [ABC276Ex] Construct a Matrix
Problem Link
給定 \(n\times n\) 的 012 矩陣 \(A\),\(q\) 個限制要求 \(A_{[a,b],[c,d]}\) 子矩陣的元素乘積 \(\bmod\ 3=e\),構造一組解。
資料範圍:\(n,q\le 2000\)。
先處理 \(e=0\) 的情況,如果 \(e\ne 0\) 那麼 \(A_{[a,b],[c,d]}\) 均不能是 \(0\),那麼剩下的位置全部填 \(0\) 肯定可以儘可能滿足 \(e=0\) 的要求,二維字首和維護,有 \(e=0\) 子矩陣所有元素均被欽定非 \(0\),那麼肯定無解。
否則可以看成 \(1,-1\) 矩陣,再看成 \(01\) 矩陣異或和為 \([e=2]\)。
那麼可以用異或方程組解決,但是變數有 \(n^2\) 個,字首和最佳化一下,每次只涉及 \(4\) 個變數,離散化後至多 \(4q\) 個變數 \(q\) 條限制,std::bitset
最佳化高斯消元即可。
時間複雜度 \(\mathcal O(n^2+\dfrac{q^3}\omega)\)
Submission Link
12. [ABC277Ex] Constrained Sums
Problem Link
構造 \(x_1\sim x_n\in[0,m]\) 滿足 \(q\) 個限制:\(x_u+x_v\in[l,r]\)。
資料範圍:\(n,q\le 1000,m\le 100\)。
首先可以考慮 2-SAT 模型,\(x_u=i\) 時對於 \(x_v<l-x_u\) 或 \(x_v>r-x_u\) 的點不可能,注意到每次操作都是單點對前字尾連邊。
那麼可以用前字尾最佳化建圖,記 \(y_{u,i}=[x_u\ge i]\),那麼連邊就是 \(y_{u,i}\to \overline{y_{v,r-i+1}},\overline{y_{u,i}}\to y_{v,l-i+1}\),直接 Tarjan 解出即可。
時間複雜度 \(\mathcal O((n+q)m)\)。
Submission Link
13. [ARC158D] Equation
Problem Link
\(T\) 次詢問給定 \(n,p\),構造 \((x,y,z)\) 使得:
\[(x+y+z)(x^n+y^n+z^n)(x^{2n}+y^{2n}+z^{2n})\equiv x^{3n}+y^{3n}+z^{3n} \pmod p \]資料範圍:\(n,p\le 10^9,p\ge 5\)。
注意到左右均為齊次多項式,且次數恰好差 \(1\),那麼我們假設 \(\mathrm{LHS}=k\times \mathrm{RHS}\),那麼取 \(\left(\dfrac xk,\dfrac yk,\dfrac zk\right)\) 就能滿足題意。
不斷隨機 \(x,y,z\) 直到 \(x\ne y\ne z,\mathrm{LHS}\ne 0,\mathrm{RHS}\ne 0\)。
感性理解不合法的 \(x,y,z\) 遠小於 \(\mathcal O(p^3)\) 量級,應該期望 \(\mathcal O(1)\) 次操作就能得到解(可以證明成功率 \(\ge 75\%\))。
時間複雜度 \(\mathcal O(T\log p)\)。
Submission Link
14. [ARC158F] Random Radix Sort
Problem Link
給 \(n\) 個十進位制 \(k\) 位數,\(m\) 次操作,每次選一個位 \(d\in[0,k)\),按第 \(d\) 位上的值從小到大進行穩定排序。
求最終讓 \(a_1\sim a_n\) 變成 \(b_1\sim b_n\) 的方案數。
資料範圍:\(n\le 2\times 10^5,k\le 18\)。
首先同一個 \(d\) 操作多次,只有最後一次操作有意義,因此我們只要計數長度 \(\le k\) 的排列即可。
對於一個長度為 \(i\) 的排列,把他們填進長度為 \(m\) 的序列且每種顏色最後一項滿足順序要求方案數就是 \(\begin{Bmatrix}m\\i\end{Bmatrix}\)(第二類斯特林數),即把 \(m\) 個下標分成 \(i\) 個顏色,顏色之間按最大下標自動定序。
接下來只要考慮一些排列是否合法即可。
由於基數排序不改變值相等的數的相對順序,因此我們能知道 \(b_i\) 究竟是原來的那個元素 \(a_{p_i}\)。
對於每一對 \((b_i,b_{i+1})\),設 \(S_i=\{j\mid b_{i,j}<b_{i+1,j}\},T_i=\{j\mid b_{i,j}>b_{i+,j}\}\)。
顯然為了保證他們的相對順序,我們要求所有 \(T_i\) 中最後一個元素出現早於 \(S_i\) 中最後一個元素出現。
但這並不夠,如果 \(p_i>p_{i+1}\),我們們要求 \(S_i\) 中至少有一個元素被選。
然後就可以 dp 了,從後往前考慮排列 \(f_{s}\) 表示當前排列的字尾時 \(s\) 的答案。
加入 \(k\) 時我們要求 \(\forall k\in T_{x},S_x\cap s=\varnothing\),這個可以快速判定,維護所有 \(S_x\) 的超集,並判斷其中是否有 \(\overline s\) 即可,用高維字首和維護即可。
最後統計答案類似,維護所有 \(p_i>p_{i+1}\) 的 \(S_i\) 的超集,如果 \(\overline s\) 不在其中就把答案加上 \(dp_s\times \begin{Bmatrix}m\\|s|\end{Bmatrix}\)。
第二類斯特林數可以用容斥原理暴力算。
時間複雜度 \(\mathcal O(n\log n+nk+k^22^k)\)。
Submission Link
15. [AGC061B] Summation By Construction
Problem Link
把一個 \(K_{n,n+1}\) 的完全二分圖分成 \(n\) 條簡單路徑,第 \(i\) 條長度為 \(2i\)。
資料範圍:\(n\le 100\)。
先考慮 \(n\) 為奇數的情況。
在鄰接矩陣上劃分路徑,我們可以構造出得到如下的階梯型結構:
我麼可以把這個 \(n\times (n+1)\) 的網格劃分成 \(\dfrac{n+1}2\) 個長度為 \(2n\) 的階梯。
把每個階梯拆成大小為 \((1,n-1),(2,n-2),(3,n-3),(4,n-4),\dots\) 的兩個子階梯即可。
然後考慮 \(n\) 是偶數的情況,此時依然要劃分階梯的話就要考慮縱向劃分:
我們能劃分成一個長度為 \(n\) 的階梯,一個長度為 \(n-1\) 的階梯,還有 \(\dfrac{n}2-2\) 個長度為 \(n+1\) 的階梯。
把這些長度為 \(n+1\) 的階梯劃分成 \((3,n-2),(4,n-3),\dots\) 的兩個子階梯即可。
剩下的六個空位放 \(1,2\) 即可。
時間複雜度 \(\mathcal O(n^2)\)。
Submission Link
16. [AGC061C] First Come First Serve
Problem Link
給定 \(a_1\sim a_n,b_1\sim b_n\) 構成 \(1\sim 2n\) 的排列,且 \(a_i<b_i,a_i<a_{i+1},b_i<b_{i+1}\)。
令 \(t_i\in\{a_i,b_i\}\),求 \(t_i\) 的相對順序有多少種可能。
資料範圍:\(n\le 5\times 10^5\)。
對於一對 \((a_i,b_i)\),選 \(a_i,b_i\) 等價當且僅當 \([a_i,b_i]\) 中間沒有其他 \(t_j\)。
因此我們可以用 dp 容斥掉這種情況,\(dp_{i}\) 表示選擇了 \(t_1\sim t_i\) 的方案數。
那麼 \(dp_i\gets 2dp_{i-1}\),然後找到最大的 \(b_j<a_i\) 和 \(a_k<b_i\),那麼我們想要容斥掉 \([a_i,b_i]\) 就要求 \((j,k]\) 區間選擇一定,因此轉移 \(dp_k\gets -dp_j\)。
雙指標求解即可。
時間複雜度 \(\mathcal O(n)\)。
Submission Link
17. [AGC061D] Almost Multiplication Table
Problem Link
給定 \(n\times m\) 矩陣 \(a\),構造單調遞增數列 \(x_1\sim x_n,y_1\sim y_m\) 最小化 \(\sum_{i,j}|a_{i,j}-x_iy_j|\)。
資料範圍:\(n,m\le 5,a_{i,j}\le 10^9\)。
先二分 \(k\),那麼相當於 \(l_{i,j}\le x_iy_j\le r_{i,j}\),其中 \(l_{i,j}=\max(0,a_{i,j}-k),r_{i,j}=a_{i,j}+k\)。
不妨假設 \(x_n\le y_m\),那麼考慮調整法,從最極端情況 \(a_i=1,y_i=+\infty\) 開始調整,且每次都進行儘可能少的調整:
- 從小到大考慮 \(x_i\),將 \(x_i\) 與 \(x_{i-1}+1\) 和 \(\left\lceil\dfrac{l_{i,j}}{y_j}\right\rceil\) 取 \(\max\)。
- 從大到小考慮 \(y_j\),將 \(y_j\) 與 \(y_{j+1}-1\) 和 \(\left\lfloor\dfrac{r_{i,j}}{x_i}\right\rfloor\) 取 \(\min\)。
- 如果 \(x_n>y_m\) 或 \(y_1<1\) 無解,如果當前 \(x,y\) 合法那麼結束。
然後交換 \(x,y\) 再做一次。
感性理解一下這個演算法的正確性:首先我們每次都進行了儘可能少的調整,那麼 \(x_i\) 一定小於任何一組合法的 \(x\),\(y_i\) 一定大於任何一組合法的 \(y\),那麼每次調整直到 \(x_n>y_m\) 就說明這個區間裡根本夾不到任何一組解。
然後分析一下複雜度,我們時刻都有 \(x_ny_m\le r_{n,m}\),且 \(x_n\le y_m\),那麼 \(x_n\) 最多 \(\mathcal O(\sqrt V)\) 級別。
由於 \(x_i\) 遞增,那麼總和為 \(\mathcal O(n\sqrt V)\),且每次不可能讓所有 \(x\) 都不變,因此調整總數為 \(\mathcal O(n\sqrt V)\)。
複雜度 \(\mathcal O(nm(n+m)\sqrt V\log V)\)。
Submission Link
*18. [AGC061E] Increment or XOR
Problem Link
給定 \(x\),以及 \(n\) 個操作 \((q_i,w_i)\),你可以進行如下操作:
- \(x\gets x+1\) 代價為 \(c\)。
- \(x\gets x\oplus q_i\) 代價為 \(w_i\)。
求讓 \(x\) 從 \(s\) 變成 \(t\) 的最小代價。
資料範圍:\(n\le 8,s,t,q_i\le 2^{40}\)。
考慮觀察結構:先看最高位 \(k\),注意到每次進位後低 \(k-1\) 位都會全部變成 \(0\),按照 \(k-1\) 每次進位分割,從 \(s_k\) 開始,每次進位之前第 \(k\) 位都是 \(0\),然後變成 \(1\),最終成為 \(t_k\)(且不能進位)。
那麼觀察第 \(k-1\) 位需要哪些結構:我們需要考慮從 \(s_k\) 開始的情況,由於每次進位後相當於從 \(s=0\) 重新出發,因此還要考慮從 \(0\) 開始的情況,而最終要麼到達 \(t_k\) 要麼進位變成 \(2^k\)(低 \(k-1\) 位全部變成 \(0\))。
不斷遞迴,我們可以大概得出一個子結構:\(f_{k,x,y,S}\) 表示當前考慮了 \(k\) 位,\(S\) 是使用次數位奇數的異或運算元,\(x\in\{0,1\}\) 表示起點是 \(s_k/0\),\(y\in\{0,1\}\) 表示終點是 \(t_k/2^{k+1}\)。
先考慮邊界條件:\(f_{-1,x,y,S}=w_S+y\times C\)(\(w_S\) 表示 \(S\) 內部操作之和)。
每次轉移 \(f_{k-1}\to f_k\) 考慮兩種情況:有進位或沒進位。
如果沒進位,那麼要求 \(x\) 對應的起點異或上 \(S\) 內的元素得到第 \(k\) 位恰為 \(y\) 對應的終點(\(y=1\) 時要求第 \(k\) 位恰好為 \(1\),這樣加上進位後還能向 \(k+1\) 進位)。
如果有進位那麼相當於 \(f_{k+1,x,y,\oplus_{i=1}^m S_i}\gets f_{x,1,S_1}+ f_{1,1,S_2}+\cdots+f_{1,1,S_{m-1}}+f_{1,y,S_m}\),即中間每次都在進位,但是不能對高位有影響,因此中間部分每個 \(S_i\) 第 \(k\) 位必須是 \(1\),這樣就能透過異或消掉 \(f_{k,1,1,S_{i-1}}\) 進位的貢獻,然後再接受 \(f_{k,1,1,S_i}\) 的進位且保持不對更高位進位。
注意到轉移形式類似最短路,Dijkstra 處理即可。
時間複雜度 \(\mathcal O(2^{2n}\log V)\)。
Submission Link
*19. [AGC061F] Perfect Strings
Problem Link
定義一個 01 串是好的當且僅當串中 1 的個數是 \(n\) 的倍數,0 的個數是 \(m\) 的倍數。
求有多少個好的 01 串使得他的任何一個子串都不是好的。
資料範圍:\(n,m\le 40\)。
把 01 串看成格路,\((x,y)\) 加入 0 變成 \((x+1\bmod m,y)\),加入 1 變成 \((x,y+1\bmod n)\)。
那麼我們要求的就是經過 \((0,0)\) 的迴路且不重複經過格點。
看成在 \(n\times m\) 網格上不斷移動,我們可以看成若干條從左下邊界走到右上邊界的路徑,且起點終點互相匹配,那麼整個迴路可以被劃分成若干個不相交的段,如下圖:
假設我們列舉所有起點,那麼終點確定,且由於路徑互不相交,那麼所有起點從左上到左下再到右下按順序與終點從左上到右上到右下按順序匹配。
注意 \((0,0)\) 的左側入口和下側入口必須恰有一個被選,不妨假設是左側入口,然後交換 \(n,m\) 再做一次即可。
那麼這個問題就很簡單了,只要做一次 LGV 引理就能解決,但是注意 LGV 引理對應的行列式為有符號 \((-1)^{\mathrm{inv}(p)}\),上面的例子裡 \(p=\{4,5,6,1,2,3\}\),設橫向入口有 \(i\) 個,縱向入口有 \(j\) 個,那麼 \(\mathrm{inv}(p)=ij\)。
接下來要處理原問題,主要問題就是要處理某些起點終點可以不選,還要統計起點中橫向縱向的數量。
那麼我們把這樣可以跳過的起點直接連向終點,剩下的起點如果是橫向的就把權值 \(\times x\),縱向 \(\times y\),得到一個二元形式冪級數 \(F(x,y)\),得到 \(\sum (-1)^{ij} [x^iy^j]F(x,y)\) 就是答案。
具體的轉移網格構造出來如下圖:
可以驗證加入若干個直接匹配的排列,依然不改變每個路徑的逆序對數,符號依然是 \((-1)^{ij}\)。
那麼我們只要求出這個網格圖上對應 LGV 引理矩陣的值,由於答案是一個二元生成函式,那麼我們可以用拉格朗日插值最佳化,帶入 \(x=1\sim n+1,y=1\sim m+1\) 求出每個點值,然後對相同的 \(x\) 插一次值,然後對相同的 \(y\) 插一次值即可得到答案。
時間複雜度 \(\mathcal O(nm(n+m)^3)\)。
Submission Link
20. [ABC278Ex] make 1
Problem Link
一個非負整數序列 \(S\) 是好的,當且僅當 \(S\) 存在一個非空子序列 \(T\),滿足 \(T\) 中所有元素的異或和為 \(1\)。
有一個初始為空的序列 \(A\),以及 \(2^m\) 張寫著數字的卡片;卡片上的數字取遍 \([0, 2^m)\) 中的整數。你可以自由選擇一張卡片,將這張卡片上的數字放在 \(A\) 序列的末尾,並刪除這張卡片,以後不能再選擇它。你會一直進行這個操作,當 \(A\) 成為好的序列後停止。
給定 \(n, m\),求停止操作時長度為 \(n\) 的不同 \(A\) 序列數。
資料範圍:\(n\le 2\times 10^5,m\le 10^7\)。
考慮一步一步解開題目的限制。
首先不斷插卡片的過程相當於限制 \(A\) 中元素各不相同。
首先我們可以容斥,設 \(F_n\) 表示長度為 \(n\) 的好序列個數,那麼我們要求該序列的 \(n-1\) 字首不是好序列,那麼就是答案就是 \(F_n-(2^m-n+1)F_{n-1}\)。
然後考慮反面考慮 \(f_n=(2^m)^{\underline n}-F_n\) 表示不好的序列數量。
那麼進一步我們要處理掉元素各不相同的限制,可以設 \(g_n\) 表示沒有這個限制的序列數。
那麼 \(f_k\to g_n\) 的貢獻係數就是把 \(n\) 個下標劃分到 \(k\) 個集合中,即第二類斯特林數 \(\begin{Bmatrix} n\\k\end{Bmatrix}\),根據斯特林反演,我們得到:
那麼我們只要求出 \(g_1\sim g_n\) 和第一類斯特林數的一行。
第二個問題是經典的,直接用倍增和多項式平移求出 \(x^{\overline n}\) 的各項係數即可。
而 \(g_n\) 就是 CF1603F 中 \(x=1\) 的情況:
一遍卷積即可。
時間複雜度 \(\mathcal O(n\log n)\)。
Submission Link