雜題選做Ⅴ


前傳:

101. CF1354G Find a Gift

首先考慮我們假如知道某個盒子里是石頭怎么求解答案。考慮倍增,具體來說我們先假設第一個盒子里是石頭,否則直接返回 \(1\) 即可。那么我們第一次拿 \(1\)\(2\) 比較,如果不相等說明 \(2\) 是禮物,否則說明 \(1,2\) 都是石頭,我們再拿 \(1,2\)\(3,4\) 比較,如果不相等則說明 \(3,4\) 中有禮物,否則說明 \(1\sim 4\) 都是石頭,我們繼續比較 \(1,2,3,4\)\(5,6,7,8\),以此類推。這樣我們可以求出一個 \(k\),使得第一個裝有禮物的盒子在 \(2^{k-1}+1\)\(2^k\) 之間,然后再二分即可。這樣詢問次數上界為 \(2\log n\)

接下來考慮如何求出一個裝有石頭的盒子。直接做看起來不太容易,不過注意到題目中“\(k>\dfrac{n}{2}\)”的條件,這意味着我們可以考慮隨機化。我們考慮找到一個局部重量最大的盒子 \(x\),初始 \(x=1\),然后每次隨機一個盒子 \(y\) 並比較 \(x,y\) 的重量,如果 \(y\) 的重量大於 \(x\) 那么令 \(x\) 等於 \(y\),如此隨機 \(T\) 次之后出錯的概率就降到了 \(\dfrac{1}{2^T}\),取 \(T=20\) 就差不多了。

102. CF1355F Guess Divisors Count

一道非常奇怪的亂搞題。

首先看到這個“\(|X-Y|\le 7\)\(\dfrac{X}{Y}\in[\dfrac{1}{2},2]\)就算正確“,我們不禁可以往亂搞的方向思考。我們先考慮一個非常naive 的亂搞:考慮前 \(22\) 個質數。對於每個質數 \(p_i\) 我們找到滿足 \(p_i^x\le 10^{18}\) 的最大的 \(x\),這樣我們可以得到 \(N\) 的質因數分解形式中,前 22 個質數的次數。然后假設 \(D\) 表示現在已經確定的因子個數,那么我們輸出 \(\max(2D,D+7)\) 即可。但是這樣顯然不能通過,碰到像 \(N=2^3·101·103·107·109\) 這樣的數據就炸了。因此考慮魔改我們的算法,我們設一個閾值 \(B\),然后每 \(B\) 個質數一組批量詢問,具體來說對於連續的 \(B\) 個質數 \(p_{i_1},p_{i_2},\cdots,p_{i_B}\),我們找到滿足 \(p_{i_k}^x\le\sqrt[B]{10^{18}}\) 的最大的 \(x\),然后將這些 \(p_{i_k}^x\) 乘起來,這樣我們可以大致知道這些質數的次數,然后再輸出對應的 \(\max(2D,D+7)\) 即可。感性理解一下這樣獲得正確答案的概率肯定是比前一個算法高不少的,該算法進而也能通過此題。

103. CF1325E Ehab's REAL Number Theory Problem

首先先特判掉輸入的 \(n\) 個數中就包含完全平方數的情況。由於每個數最多包含 \(7\) 個因子,因此我們將每個數分解質因數后將每個質因子的次數 \(\bmod 2\) 之后肯定要么形如 \(p\),要么形如 \(p\times q\),其中 \(p,q\) 均為質數。而一個乘積是完全平方數的序列,就形如 \(p_1,p_1\times p_2,p_2\times p_3,p_3\times p_4,\cdots,p_{k-1}\times p_k,p_k\),要么形如 \(p_1\times p_2,p_2\times p_3,\cdots,p_{k-1}\times p_k,p_k\times p_1\)

我們考慮將其往圖論模型的方向轉化。我們建立一個虛點 \(P\),如果一個 \(a_i\) 只有一個質因子 \(p\),那么我們就連一條 \(P\)\(p\) 之間的無向邊,否則 \(a_i\) 有兩個質因子 \(p,q\),我們就連一條 \(p\)\(q\) 之間的邊,容易發現建出來的這張圖中的最小環就是答案。

直接做是平方的顯然會 TLE,不過注意到原題的圖不同於一般圖的一個地方:兩個 \(>10^3\)​ 的質因子之間不會連邊,也就是說符合要求的最小環不可能只由 \(>10^3\) 的點組成,因此我們只用以 \(<10^3\) 的質因數以及 \(P\) 為源點跑一下 BFS 求最小環然后取 \(\min\) 即可,時間復雜度 \(n\pi(\sqrt{a_i})\)

最后提一下 BFS 求最小環的方法:考慮欽定一個源點 \(s\),然后 BFS 一遍得到 \(s\) 到每個點的最短距離 \(d_x\),然后當 BFS 到某個 \(x\) 時,我們如果訪問到他的一個鄰居 \(y\)\(d_y\) 已經求得,那么我們就用 \(d_x+d_y+1\) 更新答案,雖然 \(s\to x\) 的路徑與 \(s\to y\) 有可能會有重疊,但是有重疊時的答案肯定比沒有重疊的答案來得劣,並且更優的答案肯定會在接下來的 BFS 過程中被考慮到,這也就說明了該算法的正確性。

104. CF1305F Kuroni and the Punishment

考慮一個淺顯的性質:答案不超過 \(n\),因為我們肯定可以花費不超過 \(n\) 的代價將每個數都變成 \(2\) 的倍數。思考一下這意味着什么,我們假設變換得到的序列為 \(\{b_n\}\),那么由於最優策略下需要花費的代價不超過 \(n\),因此滿足 \(|b_i-a_i|\ge 2\)\(i\) 的個數不超過 \(\dfrac{n}{2}\)。這樣一來,問題就長得一臉 杭電多校 2021 第 10 場,integers have friends 2.0 的樣子了,我們隨機一個下標 \(x\) 並強制欽定 \(b_x=a_x-1\),算一遍答案,再強制欽定 \(b_x=a_x,b_x=a_x+1\) 進行一遍同樣操作。隨機 \(20\) 次以后出錯的概率就很小很小了。

105. CF1468L Prime Divisors Selection

我們先考慮將每個數寫成 \(p^a\) 的形式,我們定義一個質因子 \(p\) 的“出現次數”為,滿足 \(a_i=p^x\)\(i\) 的個數(\(x\in\mathbb{Z}\))。顯然如果一個質因子出現次數 \(\le 1\),那么包含這些質因子的數都不能被選擇,我們就干脆把這些質因子全部踢出去,這樣我們剩下的就只有那些由出現次數 \(\ge 2\) 的質因子構成的數。

顯然如果 \(k=1\) 或者 \(k\) 超過了剩余的數的個數那肯定無解了,直接輸出 \(0\)。但是如果 \(k\)\(2\) 與剩余的數的個數之間那也有可能出現無解的情況,特例:\(a=[4,8,9,27],k=3\),因此考慮進一步分情況討論:

  • \(cnt\) 表示出現次數 \(\ge 2\) 的質因子個數,如果 \(k\ge 2cnt\) 那好辦,直接在這 \(cnt\) 個質因子中先隨便選 \(2\) 個數,然后再隨便選 \(k-2cnt\) 個數即可。
  • 否則如果 \(k\)​ 是偶數那也好辦,隨機選 \(\dfrac{k}{2}\) 個質因子,然后這些質因子中隨便選 \(2\) 個對應的數即可。
  • 否則繼續分情況討論,如果存在一個質因子 \(p\)​ 出現次數 \(\ge 3\)​ 那么我們就選 \(3\)​ 個滿足可以寫成 \(p^x\)​ 的數,然后再隨機選另外 \(\dfrac{k-3}{2}\)​ 個質因子,對於選中的質因子 \(p’\),隨便選兩個數形如 \((p’)^x\) 的數即可。
  • 否則說明所有質因子的出現次數都等於 \(2\),那么我們考慮所有不可以寫成 \(p^x\) 且沒有被我們踢掉的數,我們記這些數中質因子個數的最小值為 \(M\),那么如果 \(k<2M-1\) 就無解了。否則我們j,再選假設沒有被踢掉的數中質因子個數最小的數為 \(v\)\(v\)\(M\) 個質因子為 \(p_1,p_2,\cdots,p_M\),那么我們對於 \(i\in[1,M]\),選出兩個形如 \(p_i^x\) 的數,然后選上 \(v\) 這個數,然后再隨便選 \(\dfrac{k-2M-1}{2}\) 個剩余的質因子 \(p\),每個質因子選兩個形如 \(p^x\) 的數即可。

注意到每個數互不相同,所以只有 \(<10^9\) 的質數是有用的,其他質數的出現次數至多為 \(1\)。而如果我們考慮對 \(1\sim 10^6\) 里的質數暴力分解,這樣我們可以對所有 \(\le 10^6\) 的質數 \(p\),找出序列中所有可以表示成 \(p^x\) 的數。而如果 \(a_i\le 10^9\),並且 \(a_i\) 沒有 \(\le 10^6\)​ 的質因子,那么就說明 \(a_i\) 是質數,我們只需檢驗 \(a_i^2\) 是否是一個質數,如果是則說明 \(a_i\) 的出現次數為二,否則我們直接踢掉這個質數即可。

時間復雜度 \(n\pi(10^6)\)

106. CF1307E Cow and Treats

首先考慮一個淺顯的性質:對於同一種甜味的草,其最多被兩頭牛吃,即從左邊吃一次,從右邊吃一次。

那么不難發現,無論怎么安排,總存在一個斷點 \(p\),使得從左邊進來的牛到達的位置都在 \(p\) 左邊,從右邊進來的牛最終到達的位置都在 \(p\) 右邊。

因此我們考慮枚舉這個斷點 \(p\),那么我們需強制要求必須要有一頭牛到達 \(p\) 這個位置,否則會算重,這個就預處理 \(sum_{x,y}\) 表示有多少頭最喜歡的甜味值為 \(x\),且飢餓值 \(\le y\),再在枚舉 \(p\) 的過程中維護一個 \(suml_x\) 表示在 \(p\) 及左邊有多少個甜味值為 \(x\) 的草,\(sumr_x\) 表示在 \(p\) 右邊有多少個甜味值為 \(x\) 的草,這樣我們可以求出有多少頭牛從左邊進入時恰好能夠走到 \(p\),這樣我們就確定了最喜歡的甜味值為 \(s_p\),且從左邊進入的牛的方案數,接下來考慮從右邊進入的牛的方案數,有 \(sum[s_p][sumr_{s_p}]\) 頭牛可以從右邊進入,但是如果 \(sumr_{s_p}\ge suml_{s_p}\),那么左邊至少安排一頭牛,所以安排右邊進入的甜味值為 \(s_p\) 的牛的方案數就可以用 \(sum[s_p][sumr_{s_p}]-[sumr_{s_p}\ge suml_{s_p}]\),乘法原理計算貢獻即可。

接下來考慮計算別的甜味值 \(x\)​ 的貢獻,記 \(cntl=sum[x][suml_x],cntr=sum[x][cntr_x]\),還是分情況討論:

  • 如果 \(cntl=cntr=0\)​,那么不可能有喜歡這種甜味的牛能遲到草,直接跳過這種甜味。
  • 如果 \(cntl=cntr=1\)​,那么只有一頭牛能吃到草,且這頭牛可以從左邊進,也可以從右邊進,方案數乘 \(2\)​,牛數加 \(1\)​。
  • 否則有兩頭牛能吃到草,且安排這兩頭牛的方案數為 \(cntl\times cntr-\min(cntl,cntr)\),乘法原理計算答案即可。

時間復雜度 \(\mathcal O(nm)\)

107. CF1615F LEGOndary Grandmaster

首先碰到這樣的問題,我們肯定要考慮怎樣快速對於兩個 01 串 \(s,t\),計算從 \(s\)\(t\) 的最少步數。我們考慮這樣一個套路化的操作:對於下標為偶數的位置,我們自動將兩個字符串上對應的位置都取反,即 \(0\)\(1\)\(1\)\(0\),我們記操作后得到的字符串為 \(s’,t’\)。那么不難發現,將原字符串上兩個相鄰且值相同的位置取反,等價於交換這兩個字符,而對於相鄰且值不同的位置,交換它們則等價於什么也沒有干,因此我們可以將操作描述為,交換 \(s’\) 中兩個相鄰的字符,問最少需要多少次操作才能將 \(s’\) 變為 \(t’\)

很顯然,\(s’\) 可以變成 \(t’\) 的充要條件是 \(s’,t’\)\(1\) 的個數相同。考慮怎樣計算步數。對於一般序列,計算一個序列 \(a\) 變為 \(b\) 的最少交換次數需要計算逆序對進而求解,不過對於 01 序列而言有一個更簡便的解法:我們設 \(s’\) 中第 \(i\)\(1\) 的下標為 \(x_i\)\(t’\) 中第 \(i\)\(1\) 的下標為 \(y_i\),那么最少交換次數即為 \(\sum\limits_{i=1}^c|x_i-y_i|\),其中 \(c\)\(s’,t’\)\(1\) 的個數。這個式子看起來已經很簡便了,但是應用於此題而言還不足以在 \(\mathcal O(n^2)\) 的時間復雜度內求解,考慮進一步化簡。我們設 \(a_i,b_i\) 分別表示 \(s’[1…i]\)\(1\) 的個數以及 \(t’[1…i]\)\(1\) 的個數。那么答案可以進一步寫作 \(\sum\limits_{i=1}^n|a_i-b_i|\)。因為由於一次操作至多使 \(|a_i-b_i|\) 減少 \(1\),因此最少需要 \(|a_i-b_i|\) 次操作才能使得 \(a_i=b_i\),因此最少操作次數的下界就是 \(\sum\limits_{i=1}^n|a_i-b_i|\),而顯然我們可以通過先通過交換使 \(s’_1=t’_1\),再使 \(s’_2=t’_2\),依次類推……來達到這個下界。

發現這個結論之后就很好 DP 了,記 \(pre_{i,j}\) 表示現在以及確定了 \(s,t\)\(i\) 位的值,\(a_i-b_i=j\) 的方案數,\(suf_{i,j}\) 表示現在已經確定了 \(s,t\)\(n-i+1\) 位的值,后 \(n-i+1\) 位中,\(s’\)\(1\) 的個數與 \(t’\)\(1\) 的個數之差為 \(j\) 的方案數,那么答案即為 \(\sum\limits_{i=1}^n\sum\limits_{j=-n}^npre_{i,j}·suf_{i+1,-j}·|j|\)

時間復雜度 \(n^2\)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM