1. 程式人生 > 其它 >Atcoder 做題記錄

Atcoder 做題記錄

\(\bullet\) \(\texttt{ ARC099F Eating Symbols Hard}\)

雜湊\(h_i\) 表示執行完 \(S_{(0,i]}\) 的操作後的序列 \(A\)

\[h_i = \sum\limits_{j=-\infty}^{\infty}A_j{Base}^j\pmod {M} \]

對於四個操作:

\[+ \longrightarrow h = h+{Base}^p \]\[- \longrightarrow h = h - {Base}^p \]\[> \longrightarrow p = p+1 \]\[< \longrightarrow p = p-1 \]

\(p_i\)

為執行完 \(S_{(0,i]}\) 的操作後 \(P\) 的位置,

考慮只執行 \((l,r]\) 的操作後 \(A\) 的雜湊值:

\[h_{(l,r]} = \dfrac {(h_r-h_l)}{{Base}^{p_l}} \]

若合法,則有: \(\dfrac {(h_r-h_l)}{{Base}^{p_l}} = h_n\)

移項得到 \(h_r = h_l + h_n{Base}^{p_l}\)

列舉 \(l\) 數有多少 \(r\) 即可,時間複雜度 \(O(n \log n)\)

\(\texttt{Code}\)

\(\bullet\) \(\texttt{ ARC102E Stop. Otherwise...}\)

考慮 \(OGF\)

對於 \(ans_i\),有三種點數:

  • 任意選的,記數量為 \(a\)\(OGF\)\(\dfrac 1 {1-x}\)

  • 成對且和為 \(i\) 的數,記數量 \(b\)\(OGF\)\(\dfrac {1 + x} {1-x}\)

  • \(i/2\),只能取一個,\(OGF\)\(1 + x\)

\(ans_i = \sum\limits_{j=0}^{\infty}[x^j]\dfrac {(1+x)^{b}} {(1-x)^{a+b}}(i\&1 ?1:(1+x))\)

將其簡化,變成求 \([x^n]\dfrac {(1+x)^a}{(1-x)^b}\)

,推一下:

\[\begin{aligned}[x^n]\dfrac {(1+x)^a}{(1-x)^b}&=[x^n](1+x)^a(1-x)^{-b}\\&=\sum\limits_{i=0}^n[x^i](1+x)^a[x^{n-i}](1-x)^{-b}\\&=\sum\limits_{i=0}^n\dbinom{a}{i}\dbinom{b+(n-i)-1}{n-i}\end{aligned} \]

直接計算,時間複雜度 \(O(nk)\)

\(\texttt{Code}\)

\(\bullet\) \(\texttt{ AGC013E Placing Squares}\)

先不考慮 \(m\) 個點的限制,記 \(dp_i\) 表示覆蓋了前 \(i\) 塊的總和,則有:

\[dp_{i+1}=\sum\limits_{j=0}^{i}dp_j(i+1-j)^2 \]

直接做是 \(n^2\) 的。

考慮把 \((i+1-j)^2\) 展開,得到:

\[dp_{i+1}=\sum\limits_{j=0}^idp_j(i-j)^2 + 2\sum\limits_{j=0}^idp_j(i-j)+\sum\limits_{j=0}^idp_j \]

\(A_i = \sum\limits_{j=0}^{i-1}dp_j(i-j)^2,B_i = \sum\limits_{j=0}^{i-1}dp_j(i-j),C_i = \sum\limits_{j=0}^{i-1}dp_j\),則 \(dp_{i+1} = A_{i+1} + B_{i+1} + C_{i+1}\)

觀察到 \(n\) 很大,但是 \(m \le 10^5\),實際上可以分成 \(O(m)\) 段沒有限制的區間,使用前面的 \(dp\) 轉移,考慮矩陣快速冪:

假設已經知道 \(\begin{bmatrix}A_i & B_i &C_i\end{bmatrix}\),求 \(\begin{bmatrix}A_{i+1}&B_{i+1}&C_{i+1}\end{bmatrix}\)

  • \(dp_{i} = A_i\)

  • \(A_{i+1} = A_i + 2B_i + C_i + dp_i = 2A_i + 2B_i + C_i\)

  • \(B_{i+1} = B_i + C_i + dp_i = A_i + B_i + C_i\)

  • \(C_{i+1} = C_i + dp_i = A_i + C_i\)

則轉移矩陣為:

\[\begin{bmatrix}2&1&1 \\2&1&0\\1&1&1\end{bmatrix} \]

\(i\) 點為星星,則轉移矩陣為:

\[\begin{bmatrix}1&0&0\\2&1&0\\1&1&1\end{bmatrix} \]

\(\texttt{Code}\)

\(\bullet\) \(\texttt{ ARC066E Addition and Subtraction Hard}\)

性質題:

  • 括號只加在減號後面

  • 加了括號後,括號裡面的數前面如果有減號,那麼一定可以對答案貢獻正數

於是直接列舉最外層的左括號,取最大值即可。

\(\texttt{Code}\)

\(\bullet\) \(\texttt{ ARC060F Best Representation}\)

首先考慮整個串是否有迴圈節,這個可以使用 \(kmp\) 解決。

若沒有迴圈節,則答案一定為 \(1,1\)

否則,分類考慮:

  • 迴圈節是 \(1\):答案一定為 \(n,1\)

  • 迴圈節 \(>1\):可以發現,\(s_{1..n-1}\)\(s_n\) 可以構成一組合法的解,則最優方案一定是分成兩段,於是可以列舉斷點數一下有多少合法方案, \(\bmod 1e9+7\) 是唬人的。。

\(\texttt{Code}\)

\(\bullet\) \(\texttt{ AGC009C Division into Two}\)

\(\color{black}l\color{red}bylby\) :預測性 dp

\(f(i,0/1)\) 表示第 i 個數放入集合 0/1,第 i+1 個數放入集合 1/0 的方案數。

可以得到 \(O(n^2)\) 的暴力,然後發現轉移是一段區間,維護一下可以做到 \(O(n)\)

\(\texttt{Code}\)

\(\bullet\) \(\texttt{ ABC213G Connectivity 2}\)

狀壓 dptrick

cnt(S) 為集合 S 內元素間的總邊數, f(S) 為使得集合 S 中的所有點聯通的選邊方案數,則有:

\[\large f(S) = 2^{cnt(S)} - \sum\limits_{T\subsetneqq S} f(T) 2^{cnt(S/T)} \]

但是這樣會算重,可以考慮欽定一個點 u 沒有和 S 聯通,轉移變成:

\[\large f(S) = 2^{cnt(S)} - \sum\limits_{T\subsetneqq S,u\in T}f(T)2^{cnt(S/T)} \]

於是就做完了。

\(\texttt{Code}\)

\(\bullet\) \(\texttt{ ARC066D Xor Sum}\)

假設已有一對 \(a,b \Longrightarrow u,v\) 合法:

  • 若將 \(a,b\) 各自左移一位,可以得到 \(2a,2b \Longrightarrow 2u, 2v\)

  • 若左移後 \(a,b\) 其中一方加 \(1\),得到 \(2a+1,2b \Longrightarrow 2u+1,2v+1\)

  • 若左移後 \(a,b\) 分別都加 \(1\),得到 \(2a+1,2b+1 \Longrightarrow 2u,2v+2\)

\(f(n)\)\(u,v,a,b \le n\) 時的答案,則:

  • \(n\) 為奇數,則 \(f(n) = f(n/2) + f(n/2) + f(n/2-1)=2f(n/2)+f(n/2-1)\)

  • \(n\) 為偶數,則 \(f(n) = f(n/2) + f(n/2-1) + f(n/2-1) = f(n/2) + 2f(n/2-1)\)

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

\(\texttt{Code}\)

\(\bullet\) \(\texttt{ ABC217G Groups}\)

\(f_n\) 表示恰好被分成 \(n\)不區分非空集合的方案數,\(g_n\) 表示被分成 \(n\)區分集合的方案數。

則有:

\[\large g_n=\sum_{i = 1}^n\dbinom n if_i i!=\prod_{i=0}^{m-1}\dbinom n {cnt_i}cnt_i! \]

二項式反演得到:

\[\large n!f_n = \sum_{i=1}^n(-1)^{n-i}\dbinom n i g_i \]

直接計算即可做到 \(O(n^2)\)

\(\texttt{Code}\)

\(\bullet\) \(\texttt{ ABC141F Xor Sum 3}\)

可以發現,若二進位制下第 \(i\) 位出現了奇數次,無論怎麼劃分都會答案貢獻 \(2^i\),那麼就可以考慮先把出現次數為奇數次的位去掉。

對於出現次數為偶數的位,對答案的貢獻要麼是 \(2^{i+1}\),要麼是 \(0\)

假如集合 \(s_1\) 的第 \(i\) 位為 \(1\),那麼 \(s_2\) 的第 \(i\) 位也為一,所以說 \(s_1\)\(s_2\) 只考慮出現次數為偶數的位是相等的,因此用線性基求個最大值即可,時間複雜度 \(O(n \log n)\)

\(\texttt{Code}\)