Atcoder 題目選做(五)

DaiRuiChen007發表於2024-05-21

\(\text{By DaiRuiChen007}\)




1. [ARC159E] Difference Sum Query

Problem Link

給定 \(n,m\),定義 \(x\in[1,n]\) 的深度 \(f(x)\) 為:

  • 初始 \([l,r]=[1,n]\)
  • \(i\) 次操作求出 \(l,r\)\(a_{i\bmod m} : b_{i\bmod m}\) 的比例的中點 \(mid\)
  • 如果 \(x=mid\),那麼 \(x\) 深度為 \(i\),否則遞迴 \([l,mid-1]\)\([mid+1,r]\)

\(q\) 次詢問 \([l,r]\),求出 \(\sum_{i=l}^{r-1}|f(i+1)-f(i)|\)

資料範圍:\(n\le 10^{15},m\le 100,q\le 10^{4},2\min(a_i,b_i)\ge\max(a_i,b_i)\)

注意到每次操作實際上是在樹上二分,可以建出類似線段樹的結構,由於 \(\dfrac{a_i}{b_i}\le 2\),那麼每次區間縮小至少 \(\dfrac 13\),最大深度為 \(\mathcal O(\log_{1.5}n)\)

這棵樹的中序遍歷是 \(1\sim n\),因此所有 \(i,i+1\) 都有祖先後代關係。

那麼答案所求就是 \(l\sim r\) 虛樹上的邊。並且每條邊訪問兩次,但 \(l\to r\) 路徑上的訪問 \(1\) 次。

可以轉化為 \(rt\to l\sim rt\to r\) 的鏈並大小乘以二,減去 \(l,r\) 的深度。

\([l,r]\) 鏈並大小類似線段樹直接拆分子區間遞迴即可。

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

Submission Link




2. [ARC159F] Good Division

Problem Link

定義一個序列是好的當且僅當可以每次刪去一對相鄰不同的數把序列刪空。

現在給定一個長度為 \(2n\) 的序列 \(a\),計數有多少序列劃分方式使得每一段都是好的。

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

先考慮哪些序列是好的,手玩發現當且僅當一個序列沒有絕對眾數的時候是好的,證明如下:

有絕對眾數的序列把非絕對眾數全部用掉之後也一定剩下一些絕對眾數,因此不能清空。

否則只有出現次數為序列一半的數可能變成絕對眾數,如果這種數只有一個,那麼隨便刪都行,有兩個的話這個序列只有兩種顏色,找一個交界處一種顏色刪一個即可。

因此可以設計一個 dp:\(f_i=\sum_{j}[a_{2j+1}\sim a_{2i}\text{ is valid}] f_j\)

注意到絕對眾數這個條件一般會用摩爾投票法維護,而摩爾投票資訊容易合併,因此想到 CDQ 分治。

考慮 \([l,mid]\to [mid+1,r]\) 的貢獻,顯然 \([i,j]\) 的絕對眾數(如果存在)一定是 \([i,mid]\)\([mid+1,j]\) 的絕對眾數。

又因為絕對眾數切換至少需要兩倍的長度,因此 \([i,mid]\)\([mid+1,j]\) 中的本質不同絕對眾數只有 \(\mathcal O(\log n)\) 個。

由於摩爾投票不好同時維護多種顏色的情況,那麼我們可以列舉每個可能的絕對眾數 \(x\),只要數 \(x\) 出現次數減去 \(\ne x\) 出現次數,即可。

\([i,j]\) 有絕對眾數 \(x\) 當且僅當前字尾摩爾投票結果加起來 \(>0\),直接對字首摩爾投票結果用桶存即可。

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

Submission Link




3. [ABC279Ex] Sum of Prod of Min

Problem Link

對於所有長度為 \(n\) 元素和為 \(m\) 的數列 \(\{a_i\}\)\(\prod_{i=1}^n\min(a_i,i)\) 之和 \(\bmod 200003\)

資料範圍:\(m\in[n,2n],n\le 10^{12}\)

考慮第 \(k\) 個位置上的 OGF:

\[F_k(z)=z+2z^2+\cdots+ kz^k+kz^{k+1}+kz^{k+2}+\cdots=\dfrac{z(1-z^k)}{(1-z)^2} \]

那麼答案就是:

\[[z^m]\prod F_k(z)=[z^m]\dfrac{z^{n}}{(1-z)^{2n}}\prod_{k=1}^n(1-z^k)=[z^{m-n}]\dfrac{\prod_{k=1}^n(1-z^k)}{(1-z)^{2n}} \]

由於 \(m\le 2n\) 我們知道 \(m-n\le n\),因此我們可以把分子變成 \(\prod_{k=1}^{\infty}(1-z^k)\) 而不影響分子 \(\bmod z^{m-n+1}\)

然後就可以用尤拉五邊形數公式變成 \(\sum_{k=-\infty}^{\infty}(-1)^kz^{k(3k-1)/2}\)

那麼觀察分母發現 \(z^k\) 係數就是 \(\binom{k+2n-1}{2n-1}\)

那麼答案就是:

\[\sum_{k=-\infty}^{\infty}(-1)^k\binom{m-n-\dfrac{k(3k-1)}2+2n-1}{2n-1} \]

顯然這個式子只有 \(\mathcal O(\sqrt n)\) 項,暴力用 Lucas 定理算即可。

時間複雜度 \(\mathcal O(\sqrt n\log_{P}n)\)

Submission Link




4. [ABC280Ex] Substring Sort

Problem Link

給定 \(n\) 個字串,\(q\) 次詢問所有字串裡的第 \(k\) 小串(位置不同算不同)。

資料範圍:\(L=\sum|S_i|\le 10^5,q\le 2\times 10^5\)

考慮建立所有串的字首樹,字典序就是字首樹上的 dfs 序。

由於串數太多,考慮壓縮字首樹,即所有反串構成的廣義字尾自動機的 Parent-Tree。

答案就是這棵樹上的 dfs 序,對於同一個節點,我們要求他的 \(\mathrm{Endpos}\) 總大小和長度區間就能知道到底對應多少個子串。

那麼每個詢問離線下來 dfs 雙指標按順序找到屬於哪個節點對應的串,同理實際串長也可以簡單算出。

那麼我們只要比較 Parent-Tree 上 \(u\) 所有兒子的字典序大小,這是簡單的,因為廣義字尾自動機的性質,他的所有兒子的 lcp 必然是 \(\mathrm{len}(u)\),按該位排序即可。

時間複雜度 \(\mathcal O(L|\Sigma|+q)\)

Submission Link




5. [ABC281Ex] Alchemy

Problem Link

給定 \(X\)\(1\) 級寶石,對於一個 \(i\) 級寶石可以以如下方式合成:\(2\sim i-1\) 級的寶石各選 \(\le 1\) 個,\(1\) 級寶石選任意個不同種的,求能合成多少種 \(n\) 級寶石。

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

\(a_i\) 表示能合成的 \(i\) 級寶石的數量,容易得到 \(a_i=[z^i](1+z)^X\prod_{j=2}^{i-1}(1+a_jz)\)

考慮如何計算這個值:不妨設 \(F_i(z)=(1+z)^X\prod_{j=2}^{i-1}(1+a_jz)\),考慮分治 NTT,對於一個區間 \([l,r]\),我們從 $ F_l(z)$ 出發,然後求出 \(a_l\sim a_{mid}\),然後得到 \(F_{mid+1}(z)=F_l(z)\times\prod_{i=l}^{mid}(1+a_iz)\)

維護 \(\prod_{i=l}^{r}(1+a_iz)\) 作為該區間的返回值,每次合併左右區間答案的複雜度是 $\mathcal O(n\log^2n) $ 沒有問題。

但是 \(F_l(z)\to F_{mid+1}(z)\) 的過程中可能由於 \(F_l(z)\) 次數過高導致複雜度過高。

但我們注意到 \(F_i(z)=F_l(z)\prod_{j=l}^{i-1}(1+a_jz)\),注意到後面一部分最多貢獻 \(z^{i-l}\),因此前面至少要取 \(z^l\) 或更高次項作為係數。

同時 \(F_l(z)\) 不可能取次數 \(>z^r\) 的項的係數,因此我們只關心 \(F_l(z)\)\(z^l\sim z^r\) 的係數,那麼這樣遞迴複雜度就是正確的。

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

Submission Link




*6.[WTF22D] Welcome to Tokyo!

Problem Link

\(1\sim n\) 的數軸上有 \(m\) 個區間 \([l_i,r_i]\),對於 \(k=1\sim n\) 求出在數軸上選 \(k\) 個點至多有多少個區間與這些點有交。

資料範圍:\(n,m\le 10^6\)

看著題目的形式很像線性規劃,考慮擴充套件到實數範圍然後對偶:設 \(x_i\) 表示數軸上 \(i\) 被選了多少(實數次),對每個線段設 \(y_i=\min(1,\sum_{i=l}^r x_i)\),得到:

\[\begin{aligned} &\begin{cases} \forall i\in[1,m]: y_i\le 1\\ \forall i\in[1,m]: y_i-\sum_{j=l_i}^{r_i} x_j\le 0\\ \sum_{i=1}^n x_i\le k\\ \end{cases} \\ &\max\sum_{i=1}^m y_i \end{aligned} \]

可以證明這個線性規劃的解一定在 \(x_i,y_i\in\{0,1\}\) 時取得。

設三個式子對應的對偶變數為 \(p_i,q_i,R\),那麼對偶得到:

\[\begin{aligned} &\begin{cases} \forall i\in[1,n]:R-\sum_{l_j\le i\le r_j} q_j\ge 0 \\ \forall i\in[1,m]:p_i+q_i\ge 1 \end{cases}\\ &\min\sum_{i=1}^m p_i+kR \end{aligned} \]

注意到 \(R=\max_i\sum_{l_j\le i\le r_j}q_j,p_i=1-q_i\),那麼不妨猜測 \(p_i,q_i\in\{0,1\}\),如果把 \(q_i=1\) 看成選了該線段的話,那麼 \(R\) 就是這些線段覆蓋次數最多的單點。

那麼設線段集為 \(S\),對應的代價就是 \(m-|S|+k\times C(S)\),其中 \(C(S)\) 表示 \(S\) 這些線段覆蓋次數最多的位置的覆蓋位置。

那麼列舉 \(x=C(S)\),求出 \(f_x\) 表示每個位置覆蓋次數 \(\le x\) 時最多選多少線段,那麼 \(ans_k=\min_x m-f_x+kx\),顯然轉移有決策單調性,可以雙指標。

那麼我們只要求出 \(f_1\sim f_n\)

考慮 \(f_{x-1}\to f_x\) 的過程,\(f_0\to f_1\) 有一個經典貪心就是每次選右端點最小的線段,容易證明這個策略在 \(x>1\) 時也適用。

那麼用資料結構維護這個過程:先找到右端點最小的線段 \(q\) 並選擇,然後找到最後一個覆蓋次數達到 \(x\) 的位置 \(p\),顯然後選的線段一定有 \(l_p>x\),否則一定有 \(r_p<x\le r_q\),那麼第一步就會選 \([l_q,r_q]\),然後遞迴 \([p+1,n]\) 作為子問題即可。

我們需要 multiset 維護 \(l_i=t\) 的所有線段,每次刪除一條求出 \(r_i\) 次小的一個。

線段樹維護 \(l_i\) 在區間中,最小的 \(r_i\) 對應的線段,支援單點改(選線段)。

線段樹維護區間 \(+1\),二分最後一個 \(\ge x\) 的位置。

這些都是經典操作,可以直接維護,比較方便的寫法是把線段編號按 \(r\) 小到大重編,這樣第一棵線段樹只要維護標號即可。

容易發現每個線段至多刪除一次,因此每個線段樹的操作次數 \(\le m\)

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

Submission Link




7. [ABC283Ex] Popcount Sum

Problem Link

\(T\) 組詢問給定 \(n,m,r\)\(\sum_{i=0}^{mi+r\le n} \mathrm{popcount}(mi+r)\)

資料範圍:\(T\le 10^5,n,m,r\le 10^9\)

顯然考慮拆分每一位,對於 \(x\) 的第 \(k\) 位可以看成 \(\left\lfloor\dfrac x{2^k}\right\rfloor-2\left\lfloor\dfrac x{2^{k+1}}\right\rfloor\)

那麼設 \(p=\left\lfloor\dfrac{n-m}{m}\right\rfloor\),得到:

\[\mathrm{Ans}=\sum_{k=0}^{30}\sum_{i=0}^p\left\lfloor\dfrac{mi+r}{2^k}\right\rfloor-2\left\lfloor\dfrac{mi+r}{2^{k+1}}\right\rfloor \]

顯然可以看成 \(\mathcal O(\log V)\) 個求 \(f(a,b,c,n)=\sum\limits_{i=0}^n\left\lfloor\dfrac{ai+b}c\right\rfloor\) 的問題,類歐幾里得演算法解決即可。

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

Submission Link




8. [AGC062B] Split and Insert

Problem Link

給定一個排列 \(p_i=i\),第 \(i\) 次操作(\(1\le i\le m\))可以以 \(c_i\times k\) 的代價把末尾 \(k\) 個元素和前 \(n-k\) 個元素以任意順序歸併。

求把這個排列變成 \(a_1\sim a_n\) 的最小代價。

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

顯然可以考慮時間倒流,變成把 \(a_1\sim a_n\) 中的 \(k\) 個元素放到末尾。

考慮最後一次操作(倒流前的第一次操作),顯然序列中 \(1\sim n-k,n-k+1\sim n\) 的相對順序必須被滿足。

注意到這兩個子問題是完全獨立的,即只考慮這個排列 \(1\sim n-k\) 的部分,和 \(n-k+1\sim n\) 的部分,分別處理後每次把選擇的子序列並起來即可,顯然兩部分相對順序在最後一定分別被滿足。

那麼這就形成了子結構,\(dp_{i,l,r}\) 表示進行 \(i\sim m\) 次操作後,對值域 \(l\sim r\) 的元素排序的最小代價,轉移為:

\[dp_{i,l,r}=\min_{x=l}^r\{dp_{i+1,l,x}+dp_{i+1,x+1,r}+c_i(r-x)\} \]

邊界條件為初始滿足的 \([l,r]\)\(dp_{m+1,l,r}=0\)

時間複雜度 \(\mathcal O(mn^3)\)

Submission Link




9. [AGC062D] Walk Around Neighborhood

Problem Link

給定 \(n\)\(a_1\sim a_n\),選擇一個排列 \(p_1\sim p_n\),第 \(i\) 步恰好移動 \(a_{p_i}\)的曼哈頓距離。

找到一條從原點出發返回原點的路徑,最小化路徑到原點的最大曼哈頓距離。

資料訪問:\(n,a_i\le 2\times 10^5\)

先對 \(a\) 升序排序,考慮什麼時候無解,顯然 \(\sum_{i=1}^{n-1}a_i<a_n\) 時必然無解,假如第一步走 \(a_n\),那麼無論如何也回不去。

設答案為 \(d\),那麼一步移動最多 \(2d\),因此 \(\dfrac{a_n}2\le d\le a_n\),顯然最優解一定會經過邊界,按這個過程分成兩條原點到邊界的路徑。

由於 \(a_i\le a_n\le 2d\),那麼只要找到這兩條路徑,剩餘的步數可以直接在邊界上移動掉。

根據調整法,一條路徑可以走到邊界上,那麼這條路徑能走到邊界上的任意一個點。

那麼我們找到一個 \(S\),一個 \(T\),使得 \(S\cap T=\varnothing\) 並且用這兩個集合裡的移動分別能走到邊界上。

先進行所有 \(<d\) 的操作,如果這些距離的和 \(\ge d\),那麼直接合法,否則我們考慮用一個 \(\ge d\) 的操作 \(a_k\),我們只要用 \(\le d\) 的操作走到 \(a_k-d\) 上即可。

顯然兩個 \(a_k\) 分別要取 \(\ge d\) 的最小值 \(x\) 和次小值 \(y\),不存在 \(y\) 則取 \(y=2d\)

然後我們要把 \(\le d\) 的元素分成兩部分分別大於 \(x-d,y-d\),維護 \(<d\) 的數對應的揹包,求出 \(\ge x-d\) 的最小子集,剩餘的判斷是否 \(\ge y-d\) 即可,這個過程可以 std::bitset 維護。

容易發現所求的子集和 \(<y-d+d\le a_n\),那麼只要維護 \(\mathcal O(V)\) 個位置的揹包。

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

Submission Link




*10. [AGC062E] Overlap Binary Tree

Problem Link

定義一個長度為 \(n\) 的二元組序列 \([(l_1,r_1),(l_2,r_2),\cdots,(l_n,r_n)]\) 是好的,當且僅當:

  • \((l_1,r_1,l_2,r_2,\cdots,l_n,r_n)\) 構成一個 \(1\sim 2n\) 的排列。
  • \(l_1<l_2<l_3<\cdots<l_n\)
  • \(\forall 1\le i\le n,l_i<r_i\)
  • 恰好存在 \(k\)\(i\) 滿足 \(l_i+1=r_i\)
  • 存在一個有 \(n\) 個節點的有根樹滿足對於任意 \(i,j\)\(i,j\) 在樹上有祖先-後代關係當且僅當區間 \([l_i,r_i],[l_j,r_j]\) 有交(可以是包含關係),並且該樹滿足每個節點有零個或兩個兒子。

給定 \(n,k\),數有多少個好的二元組序列,對 \(998244353\) 取模。

先不考慮第四個限制,考慮把一個合法序列建成二叉樹。

顯然和所有區間都有交的區間只有一個,把這個區間提到根上,然後刪掉。

那麼剩下的 \(n-1\) 個區間可以分成值域不相交的恰好兩部分,分別遞迴左右子樹即可。

顯然一個區間序列可以唯一對應一棵無標號二叉樹,那麼列舉一棵無標號二叉樹嘗試計算對應的合法序列數量。

自下往上確定每個區間,考慮 \(l_u\) 的取值,顯然 \(l_u\le\min_{v\in\mathrm{subtree}(u)} r_v\)

我們考慮 \(l_u\) 在子樹裡的 \(2siz_u\) 個點裡相對順序,那麼插入方案數為 \(1+\sum_{i\in\mathrm{subtree}(u)} [l_i\le \min r]\),顯然 \(\min r\) 在從 \(u\) 出發不斷向左走到的那個葉子上,而合法的 \(i\) 肯定就是這條不斷向左走到的鏈上的節點。

\(i\) 向左走的鏈上有 \(d\) 個點,那麼方案數為 \(d+1\)

從葉子上計數,設這個葉子向上最多走 \(d\) 條同向邊,那麼總方案數為 \((d+1)!\)

設葉子數 \(m=\dfrac {n+1}2\),那麼我們可以把這 \(m\) 條鏈縮起來,即把 \(i\) 的父親設為從第 \(i\) 個葉子所在的鏈頂所在的鏈。

最終會得到一棵有兩個根的無標號樹(根之間有順序),這兩個根就是原樹根節點所在的兩條同向鏈。

一個轉化的例子如下圖(來自官方題解):

可以發現一條鏈的長度在轉化後就是一個點的度數。

\(m\) 個點標號,設第 \(i\) 個點的度數為 \(d_i\),那麼貢獻就是 \(\prod_{i=1}^{m}(d_i+1)!\)

然後考慮生成樹的個數,每次選一條邊,然後找一個沒有父親的點當兒子,方案數為 \(\prod_{i=1}^{m-2} (m-i)\times (m-i+1)\)

最後除去選邊的順序 \((m-2)!\),再區分兩個根的順序得到總方案數為 \(2(m-1)!\)

用生成函式描述答案:

\[\mathrm{Ans}=\dfrac{2(m-1)!}{m!}[z^{2m-2}]\left(\sum_{i=1}^{m-1}(i+1)!z^i\right)^m \]

現在考慮加入第四個限制,顯然長度為 \(1\) 的區間肯定是葉子,如果走到底得到的點是一個長度為 \(1\) 的區間,那麼 \(l_u\) 不能插入這兩個點中間,方案數為 \(d\)

那麼一個葉子被欽定長度為 \(1\),方案數會變成 \(d!\),欽定長度 \(>1\) 就會得到方案數為 \((d+1)!-d!\),得到:

\[\mathrm{Ans}=\dfrac{2(m-1)!}{m!}\binom mk[z^{2m-2}]\left(\sum_{i=1}^{m-1} i!z^i\right)^k\left(\sum_{i=1}^{m-1} ((i+1)!-i!)z^i\right)^{m-k} \]

用多項式快速冪解決,注意到兩個多項式的 \(z^1\) 係數都為 \(1\),約去一個 \(z\) 即可方便處理。

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

Submission Link




11. [ABC289Ex] Trio

Problem Link

數軸上有三個動點初始在 \(a,b,c\),每秒隨機移動到左鄰居或右鄰居,求 \(n\) 秒後三個人首次相遇的機率。

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

先求方案數最後除以 \(8^n\)

考慮容斥,設 \(f_i\)\(i\) 秒後的答案,\(g_i\) 表示 \(i\) 秒後相遇(不要求首次的方案數),\(h_i\) 表示三個點從原點出發,\(i\) 秒後相遇的方案數。

那麼我們知道 \(f_i=g_i-\sum_{j<i}f_jh_{i-j}\),設出生成函式 \(F,G,H\) 得到 \(F=G-F(H-1)\),得到 \(F=\dfrac{G}H\)

只要求出 \(G,H\),其中 \(H\) 只要令 \(a=b=c\) 再求一輪即可。

先平移使得 \(0=A\le B\le C\),容易得到:

\[g_i=\sum_x\binom{i}{\dfrac{i+x-a}2}\binom{i}{\dfrac{i+x-b}2}\binom{i}{\dfrac{i+x-c}2} \]

不妨假設 \(i=2k,a=2a',b=2b',c=2c'\) 得到:

\[\begin{aligned} g_{2k} &=\sum_x\binom{2k}{x+k-a'}\binom{2k}{x+k-b'}\binom{2k}{x+k-c'}\\ &=(2k)!^3\sum_x\dfrac 1{(x+k-a')!(x+k-b')!(x+k-c')!}\times \dfrac{1}{(a'+k-x)!(b'+k-x)!(c'+k-x)!} \end{aligned} \]

設兩式分別和 \(x+k/x-k\) 有關,且和恰好為 \(2k\)

那麼設 \(p_i=\dfrac{1}{(i-a')!(i-b')!(i-c')!},q_i=\dfrac 1{(i+a')!(i+b')!(i+c')!}\),則 \(G(z)\) 只要由 \(P(z)\times Q(z)\) 即可得到。

對於 \(i=2k+1\) 也能得到一樣的結果,那麼卷一次就得到結果。

最後多項式求逆除一下即可。

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

Submission Link




*12. [ABC290Ex] Bow Meow Optimization

Problem Link

給定 \(n\) 個 A 和 \(m\) 個 B,每個有權值 \(v_i\),定義一個排列中某個位置的係數 \(d_i\) 為他左右兩側另一種字元的出現次數之差。

重排整個序列,求最小的 \(\sum v_i\times d_i\)

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

先考慮列舉一個 A,B 的排列,算最小代價。

首先對於排列中所有的 A,他們中的 \(d_i\) 是單峰函式,這是顯然的,B 也是同理。

因此根據排序不等式排列所有 A 和 B 即可。

假設 \(n,m\) 都是偶數,那麼前 \(\dfrac{n+m}2\) 個數中恰好有 \(\dfrac n2\) 個 A 和 \(\dfrac m2\) 個 B。

否則假設 A 數量較少,找到下一個 A,把他插到 \(\dfrac{n+m}2\) 上,顯然這個 A 的係數在減少,並且這一段裡的 B 的係數也在減小。

如果 \(2\nmid n\),那麼顯然最大的 \(a_i\) 在序列中間,同理 \(2\nmid m\) 也一樣,我們只要考慮 \(2\mid n,m\) 的情況。

此時大膽猜測 \(\dfrac{n+m}2\) 左側的所有 \(v_i\) 都是遞增的,顯然對於 A 和 B,他們同種字元內部的 \(v_i\) 滿足這個關係。

否則如果 \(v_i>v_{i+1}\) 且兩種字元不同,交換後代價減少 \(v_i-v_{i+1}\),證畢。

所以我們按權值從大到小考慮所有字元,並且討論當前字元放在序列的最左邊還是最右邊即可。

\(f_{t,i,j}\) 表示考慮了權值最大的 \(t\) 個,其中 \(i\) 個 A 和 \(j\) 個 B 被放在 \(\dfrac{n+m}2\) 左邊的最小代價。

轉移時列舉每個 A/B 的決策轉移即可。

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

Submission Link




13. [AGC063C] Add Mod Operations

Problem Link

給定 \(a_1\sim a_n\) 每次操作能選 \(x,y\) 令所有 \(a_i\gets (a_i+x)\bmod y\)\(n\) 次操作內使得 \(\{a_i\}\)變成 \(\{b_i\}\)

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

首先如果 \(a_i=a_j,b_i\ne b_j\) 就一定不行,然後我們就能去重 \(a_i\) 並升序排列。

手玩可以發現:令 \(y=a_n+x\),那麼就能讓 \(a_1\sim a_{n-1}\) 加上 \(x\),然後 \(a_n=0\)

逐步清空原本 \(a_i\) 的影響,設第 \(i\) 次操作取 \(x_i\),那麼最後 \(a'_i=\sum_{j=n-i+2}^{n}x_j\)

那麼 \(a’\) 遞增,如果 \(b_1=0\)\(b\) 遞增,直接取合適的 \(x_1\sim x_n\) 即可解決。

否則考慮取充分大值 \(A\),令 \(b'_i=b_i+iA\),那麼再操作一次 \(x=b'_1,y=A\) 即可。

但是這樣運算元 \(n+1\),還要再最佳化一下,注意到 \(x_1\) 沒有什麼用,那麼 \(a'_1=a_1+\sum_{i=1}^{n-1}x_i\),取一個合適的 \(x_1=x'_1-a_1\),那麼操作一次 \([x'_1,x'_1+a_2-a_1,\dots,x'_1+a_{n-1}-a_1,0]\),那麼再來 \(n-2\) 次操作就能消掉所有 \(a_i\),此時 \(a'_2,a'_3,\dots,a'_n,a'_1\) 遞增,類似處理即可。

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

Submission Link




*14. [AGC063E] Child to Parent

Problem Link

給定 \(n\) 個點的有根樹,每個節點上有一個數 \(a_i\)

每次操作可以選定 \(a_u>0\) 然後 \(a_u\gets a_u-1,a_{fa(u)}\gets a_{fa(u)}+r\)

求有多少個不同的 \(\{a_i\}\) 可以被生成。

資料範圍:\(n\le 300,a_i,r\le 10^9\)

首先合法操作必然可以調成從下到上,那麼我們設 \(f_{u,i}\) 表示 \(u\) 子樹向上進位 \(i\) 的答案。

那麼每次 \(f'_{u,i+jr}\gets f_{u,i}\times f_{v,j}\),然後 \(f_u\) 做字尾和。

先考慮根節點上的 \(f\),用生成函式 \(f_u\) 刻畫:那麼我們要求的就是所有方案中 \(a_u+r\sum j_v\) 的值之和。

那麼分拆下去我們要知道 \(\sum_j jf_{v,j}\),進一步要知道 \(\sum_j j^2f_{w,j}\),其中 \(fa(w)=v\)

\(F_{u,k}=\sum f_{u,i}i^k\),那麼考慮轉移:

\[\begin{aligned} F'_{u,k}&=\sum_if'_{u,i}i^k\\ &=\sum_i (i+jr)^k\sum_{j} f_{u,i}f_{v,j}\\ &=\sum_{i} \binom kp f_{u,i}i^p\sum_{j} f_{v,j}j^{k-p}r^{k-p}\\ &=\sum_i\binom kpr^{k-p}F_{u,p}F_{v,k-p} \end{aligned} \]

轉移很簡單,考慮每次做字尾和:

\[F'_{u,k}=\sum f_{u,i}(0^k+1^k+2^k+\cdots +i^k) \]

把自然數冪和看成一個關於 \(i\)\(k+1\) 次多項式,這個是經典的,就能從 \(F_{u,0\sim k+1}\)推出 \(F'_{u,k}\),顯然 \(F_{u}\) 只要考慮 \(k\le dep_u\) 的答案。

再做字尾和前求出 \(F_{rt,0}\) 就是答案。

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

Submission Link




15. [ARC160D] Mahjong

Problem Link

定義一個序列是好的當且僅當:它可以透過給長度為 \(k\) 的區間 \(-1\) 和單點 \(-k\) 兩種方法清零。

求長度為 \(n\),元素和為 \(m\) 的好序列有多少個。

資料範圍:\(n,k\le 2000,m\le 10^{18}\)

考慮一個序列會對應多少清零序列,注意到兩個清零序列本質相同只可能是把 \(k\) 個區間 \(-1\)\(k\) 個單點 \(-k\) 互相轉化。

那麼我們欽定區間 \(-1\) 運算元量 \(<k\),此時合法序列與清零序列一一對應,然後數合法的清零序列即可。

\(x_1\sim x_{n-k+1}\) 為每個區間被 \(-1\) 的數量,\(x_{n-k+2}\sim x_{2n-k+1}\) 表示每個位置被單點 \(-k\) 的數量。

那麼 \(\sum x_i=\dfrac mk,x_1\sim x_{n-k+1}<k\),直接容斥,組合數暴力計算。

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

Submission Link




16. [ARC160E] Make Biconnected

Problem Link

給一棵 \(n\) 個點的二叉樹,點有點權,加入一條邊的代價時兩端點點權和。

最小化加入邊的代價和使得這張圖變成點雙連通圖,給出構造。

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

顯然所有葉子都必須連一條邊,否則刪掉他的父親就不連通了。

假設這棵樹有偶數個葉子 \(l_1\sim l_k\),我們可以把他們們兩兩匹配使得全圖點雙連通:

把葉子按 dfs 序排列,連線 \(l_i,l_{i+k/2}\)

顯然刪掉一個點之後整棵樹最多分成 dfs 序上的三個區間。

若分成區間數 \(\le 2\) 時是簡單的。

否則討論 \(l_{k/2}\) 屬於哪個區間,如果是第一個或第三個,那麼這個區間和另外兩個都連通。

如果在第二個區間,那麼二三區間顯然連通,並且第一個區間和 \(l_{k/2+1}\) 連通,那麼三個區間連通。

否則我們考慮給一個葉子和樹上某個點連線,其他點用上述方式構造。

對於一個葉子 \(x\),設他祖先裡第一個三度點為 \(p\),那麼 \(x\to p\) 的路徑(包括 \(p\))以外都合法。

那麼我們可以用類似換根 dp 的方式求出刪掉每個點的代價,選最小值即可。

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

Submission Link




17. [ARC160F] Count Sorted Arrays

Problem Link

給定 \(n!\)\(n\) 個排列,\(q\) 次操作給定 \(u,v\),對於每個 \(p_u>p_v\) 的排列交換 \(p_u,p_v\),求出有多少排列被排好序,強制線上。

資料範圍:\(n\le 15,q\le 5\times 10^5\)

顯然可以用經典的 01 序列的技巧,設 \(a_i=[p_i\ge x]\),那麼暴力維護我們能知道每個 01 序列進行 \(q\) 此操作後會變成什麼。

一個排列合法當且僅當分成的每個 01 序列最後操作完都是有序的。

考慮把一個排列看成從 \(00\dots 0\) 走到 \(11\dots 1\) 的路徑,每次把一個 \(0\) 變成 \(1\),要求經過的 01 序列最後都被排序,那麼這就是一個路徑計數問題,簡單 dp 即可。

但此時複雜度為 \(\mathcal O(q2^n)\),注意到有至少一處影響的非平凡運算元大概是 \(\mathcal O(n^2)\) 級別的,只有存在至少一個 \(p_u>p_v\)\((u,v)\) 操作才是有必要的。

每次加入非平凡操作時更新所有過 \(u/v\) 的操作的必要性狀態即可。

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

Submission Link




18. [ARC161E] Not Dyed by Majority (Cubic Graph)

Problem Link

給定一張圖,每個點度數為 \(3\),給每個點賦值 \(0/1\),定義一次變換是把每個點的權值同時變成其鄰域權值的眾數。

構造一個不可能是變換後結果的顏色序列。

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

考慮如何 檢驗 \(\{c_u\}\) 是否可以被 \(\{d_u\}\) 生成,顯然可以用 2-SAT 解決。

\(c_u=0\)\(N(u)=\{x,y,z\}\),那麼 \(d_x=1\implies d_y=0,d_z=0\),輪換後同理。

我們只要找到一個使得 2-SAT 無解的序列。

容易發現假如兩個序列在變換後結果相同,那麼就必定會產生一個序列不可生成。

考慮 \(1\) 的鄰域 \(x,y,z\),以及他們的鄰域 \(\{1,x_0,x_1\},\{1,y_0,y_1\},\{1,z_0,z_1\}\):如果 \(d_{x_0}=d_{x_1},d_{y_0}=d_{y_1},d_{z_0}=d_{z_1}\),那麼無論 \(d_1\) 是什麼,答案都不會更改。

因此我們說明至少有 \(\dfrac 1{16}\) 的序列會互相重複,那麼期望 \(\mathcal O(1)\) 次隨機後能得到一組解。

Submission Link




19. [ABC293Ex] Optimal Path Decomposition

Problem Link

\(n\) 個點的樹進行樹鏈剖分,每個鏈染一個顏色,最小化路徑顏色數的最大值。

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

根據重鏈剖分的結論,答案不可能超過 \(2\log_2n\),然後可以二分答案 \(k\)

check 的時候設 \(f_{u,0/1/2}\) 表示當前和 \(u\) 顏色相同的兒子有至多 \(0/1/2\) 個,此時合法情況中最小的最大深度(深度指到 \(u\) 路徑顏色數)。

對於一條邊 \(u,v\)

  • \(f_{u,i}+f_{v,2}\le k\)\(f_{u,i}\gets \max(f_{u,i},f_{v,2}+1)\) 表示選不同顏色。
  • \(f_{u,i}+f_{v,1}-1\le k\)\(f_{u,i+1}\gets \max(f_{u,i},f_{v,1})\) 表示選同顏色。

直接轉移即可。

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

Submission Link




20. [AGC064C] Erase and Divide Game

Problem Link

給定 \(S=\bigcup_{i=1}^n[l_i,r_i]\),兩個人輪流操作,刪去奇數或偶數,然後把剩下 \(S\) 中元素除以二下取整,刪空的人獲勝,問誰必勝。

資料訪問:\(n\le 10^4,l_i,r_i\le 10^{18}\)

先考慮 \(l_i=r_i\) 的情況,那麼相當於反串建 Trie 輪流向下移動,從下往上維護 dp 即可,\(f_u=\overline{f_{ls}}\operatorname{OR}\overline{f_{rs}}\)

那麼現在面對的是若干區間,考慮自下而上地維護:先考慮最高位 \(k\),在 Trie 上就是最低一層,每次合併 \(i,i+2^{k-1}\),但是這裡的合併可能是 \(f=0/1\) 或空節點。

注意到每次操作不用一個一個合併,可以把勝負態相同的一段區間一起合併:把所有區間分成 \([0,2^{k-1}),[2^{k-1},2^k)\),然後雙指標把兩部分的區間合併起來。

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

Submission Link

相關文章