1. 程式人生 > 其它 >刷(shui)題記錄 2021.12[2]

刷(shui)題記錄 2021.12[2]

[CF-1373G] Pawns

\(\Rightarrow \rm luogu\) 連結

將問題轉化一下,可以認為是一個數軸上有若干個點,初始的時候某些位置可能會有多個點,每個點可以向右移動,問最優策略下移到最遠的點的座標,支援增加/刪去一個點。

首先考慮沒有增加刪除操作要怎麼做,可以想到逐個加入考慮數軸上的點,將其移動到其初始位置往右(包括初始位置)第一個空的位置即可。可以發現點的考慮順序並不作要求。

考慮有增加刪除的情況,把最終位置連續的點看成一團。顯然,因為點的考慮順序不要求,把操作的點看成是最後一個被考慮的,對於增加,可以直接往所在的團最右邊加一個;對於刪除,直接去除所在的團的最右邊一個。這些操作明顯可以用線段樹搞定。

[CF-1466G] Song of the Sirens

\(\Rightarrow \rm luogu\) 連結

\(S\) 表示詢問的串,\(m\) 表示詢問的 \(k\) ,首先可以用 \(\verb|kmp|\) 或者 \(\verb|hash|\) (容易 \(\verb|hash|\) 衝突,不建議使用)求出 \(S\) 匹配 \(s_0\) 的答案,設其為 \(f_0\) ,那麼其對答案的貢獻為 \(2^k f_0\) ,接著求出 \(s_i\) 中經過 \(t_i\) 的匹配次數,設其為 \(f_i\) ,顯然可以抽出子串 \(s_{i-1,[|s_{i-1}|-|S|+1, |s_{i-1}|]} t_i s_{i-1, [1,|S|-1]}\)

匹配 \(S\) 即可,其對答案的貢獻為 \(2^{k-i} f_i\),但是這樣要做 \(O(k)\) 次,會超時。

這時候需要找性質,可以發現對於滿足 \(|s_{i-1}| > |S|\) 的,並且中間位置(即 \(t_{i-1}\) 相同)的,其 \(f_i\) 是相同的,證明比較顯然。可以用第一個長度大於 \(|S|\)\(s_i\) 作為兩側,然後列舉中間的字元 \(t\) ,這樣得到的匹配次數為 \(g_t\) ,貢獻顯然為:

\[\mathrm{ANS} \leftarrow g_t\cdot \sum_{j=i+1}^k 2^{k-j}[t_j=t]=2^k g_t \sum_{j=i+1}^k 2^{-j}[t_j=t] \]

後面一串顯然可以使用字首和優化。

[CF-1468L] Prime Divisors Selection

\(\Rightarrow \rm luogu\) 連結

設正整數 \(X\) 的質因數分解為 \(\prod_{i=1}^{m(X)} p(X)_i^{c(X)_i}\)

首先考慮如何判斷一個序列 \(A\) 是否合法。考慮一個出現於 \(A\) 中某一個元素的質因子 \(p\)\(A\) 中必須存在至少兩個元素是 \(p\) 的冪。比如對於第一個樣例 \(\{2,4,6\}\),沒有元素是質因子 \(3\) 的冪,所以不合法。

接下來可以找到待選集合中所有是某質數冪的所有數。設 \(p(x)\) 表示這個質數,形式化的,有:

\[p(x)= \begin{cases} -1 & C(x)>1\\ p(x)_1 & C(x)=1 \end{cases} \]

而我們需要找到待選集合中所有 \(p(x)\ne -1\) 的數。但是由於數的值域過大,我們不能使用一般的質因數分解,而是需要首先用 \(\verb|Miller_Rabin|\) 判斷 \(x\) 本身是否是指數,如果本身不是質數,那麼可以首先嚐試對其開方,如果成功那麼 \(p(x)=p(\sqrt x)\) 這時候轉化為求 \(p(\sqrt x)\) ,當然了,也可以嘗試將其開三次方,如果成功,直接求 \(p(x^{\frac{1}{3}})\) 如果都不成功,那麼列舉 \(\leq x^{\frac{1}{5}}\) 的質數即可,這個範圍的質數就可以用線性篩篩出。

求出 \(p(x)\) 之後,考慮對於一個質數 \(p\) ,如果不存在至少兩個 \(x\) 滿足 \(p(x)=p\) ,那麼顯然包含質因子 \(p\) 的所有數都是不能被選擇的,我們首先找出滿足至少兩個 \(x\) 滿足 \(p(x)=p\) 的所有質數 \(p\) ,組成集合 \(P\) ,用 \(P\) 對所有 \(x\) 進行質因數分解,不成功的就不能被選擇,設可以被選擇的陣列成了新的侯選集合 \(S\) 。同時,為了方便構造方案,對於任意一個 \(P\) 中的質數 \(p\) ,挑出兩個滿足 \(p(x)=p\)\(x\) ,記為 \(s(p)_0, s(p)_1\) ,然後將它們從 \(S\) 中刪去。

接著考慮構造方案。進行分類討論:

  • \(2|P|\ge k\)
    • \(2 \mid k\):這時候隨便抽取 \(P\)\(\frac{k}{2}\) 個質數,對於任何一個被選擇的質數 \(p\) ,挑取兩個 \(p(x)=p\)\(x\) 加入答案即可。
    • \(2 \not|~~ k\) :這時候需要在剩下的侯選集合中挑出一個數,顯然,某個數 \(x\) 能被選擇當且僅當 \(2C(x) \leq m\) ,選擇了這個數時候,將 \(x\) 所有質因子 \(p\)\(s(p)_0, s(p)_1\) 加入答案。如果還剩一些空位,就在 \(P\) 中跳出一些剩下的 \(p\)\(s(p)_0, s(p)_1\) 加入答案。
  • \(2|P|< k\) :首先將所有 \(p\in P\)\(s(p)_0, s(p)_1\) 加入答案,然後剩下的位置加入 \(S\) 中的數。如果發現不夠,就表示無解。

[CF-1469F] Power Sockets

\(\Rightarrow \rm luogu\) 連結

貪心的想,一定是將鏈的中點連到當前最淺的白點上,至於鏈的選擇順序,可以是按從大到小選擇,可以證明這一定是最優的,接下來只需要用一個動態開點的權值線段樹,支援區間加/減,找 \(k\) 大即可。

[CF-1486F] Pairs of Paths

\(\Rightarrow \rm luogu\) 連結

\(\mathrm{lca}(u,v)\) 表示路徑的 \(\rm lca\) 。設 \(\mathrm{blg}(a,l)\) 表示 \(a\) 往上跳 \(\mathrm{dep}(a)-\mathrm{dep}(l)-1\) 步到達的點。

設兩條路徑 \((a,b),(c,d)\) 的交只有一個點,若 \(\mathrm{lca}(a,b)=\mathrm{lca}(c,d)=l\) ,那麼就表示 \(b(a,l),b(b,l),b(c,l),b(d,l)\) 均不相同;若 \(\mathrm{lca}(a,b) \ne \mathrm{lca}(c,d)\) ,設 \(\mathrm{lca}(a,b)\) 的深度較大,那麼當且僅當 \(c\)\(d\) 其中一個點在子樹 \(T_{\mathrm{lca}(a,b)}\) 中,且不在 \(T_{b(a,\mathrm{lca}(a,b))}\)\(T_{b(b,\mathrm{lca}(a,b))}\) 中。

顯然可以兩種情況分開算,容斥一下就行了。

[CF-1487G] String Counting

\(\Rightarrow \rm luogu\) 連結

觀察性質,可以發現超過限制的字元至多兩個,可以使用容斥計算。首先計算出沒有限制的情況,顯然是:

\[\mathrm{ANS}_0=25^{n-2} 26^2 \]

對於有一個限制的情況,使用 \(\verb|dp|\) ,設 \(f(i,j,0/1, 0/1)\) 表示當前考慮了前 \(i\) 個位置,其中選定的字元 \(c\) 使用了 \(j\) 個,第 \(i-1\) 個位置是否選擇了 \(c\) ,第 \(i\) 個位置是否選擇了 \(c\) 的方案數,轉移顯然。可以發現無論選擇了什麼字元,\(f\) 都是一樣的。

對於有兩個限制的情況,也是類似的。

最終答案就是 \(\mathrm{ANS}_0\) 減去第一種情況,加上第二種情況。

[CF-1555F] Good Graph

\(\Rightarrow \rm luogu\) 連結

要先找性質。如果考慮在一個好圖中加入一條邊,如果這條邊使得連通性變化,那麼顯然這條邊可以加入。如果不改變連通性,那麼就會構成至少一個環,如果存在一個環和之前的環的重合了,那麼必定會讓圖變成壞圖,不能加入。這個東西要畫幾下草稿。

那麼可以將操作離線,構建出一個森林,對於樹邊,直接輸出 \(\verb|YES|\) ,對於非樹邊,設其為 \((u,v)\) ,那麼樹上路徑 \(P(u,v)\) 的異或和必須和 \(w(u,v)\) 不同,同時 \(P(u,v)\) 上任何一條邊不能被之前的環覆蓋。上面這些操作顯然可以用並查集,樹剖\(+\)線段樹完成。

[CF-1476F] Lanterns

\(\Rightarrow \rm luogu\) 連結

首先要將可行性轉為求最優值,然後用 \(\verb|dp|\) 求解。

\(f(i)\) 表示考慮了前 \(i\) 個點,當前能覆蓋的最長字首長度。可以發現這個陣列單調不降。考慮兩種操作,首先是向左的操作。顯然可以得到:

\[f(i) \leftarrow \max_{j<i, f(j) \ge i - p_i - 1}\{ \max\{j + p_j, f(j)\} \} \]

因為 \(f(i)\) 單調不降,所以可以變成:

\[\begin{align} f(i) &\leftarrow \max\left\{i - 1, \max_{j<i, f(j) \ge i - p_i - 1}\{j + p_j\}\right\}\\ f(i) &\leftarrow f(i - 1)\\ \end{align} \]

這個轉移可以是用二分 \(+\) \(\verb|ST|\) 表優化。

另一種是向右的,這種可以使用的條件顯然是 \(f(i-1) \ge i\)

\[\begin{align} f(i) \leftarrow i + p_i \end{align} \]

最終的可行條件顯然是 \(f(n) \ge n\) 。至於方案的構造,從後往前構造。記住 \(f(i)\) 由哪條轉移得到。如果是第一條,顯然 \(i\) 選擇向左,否則就是向右的。如果選擇向左,記住最小的 \(f(j) \ge i - p_i - 1\)\(j\) ,設為 \(t(i)\) ,那麼 \(t(i)+1 \cdots i - 1\) 都可以設為向右,然後跳到 \(t(i)\) 繼續構造。