Ad-hoc 題目總結

LCat90發表於2024-11-24

9915, 9870

這是一年前寫的:https://www.becoder.com.cn/article/14590。

現在我在其基礎上,再補充這一年做的一些新題。

力推:https://www.cnblogs.com/rainybunny/p/15398779.html。

我先逗大家樂一下:

Ad-hoc 題可能不一定能找出實力最強的選手,但一定能找出最適合做出題人 npy 的選手。


P11277

構造一個長為 \(n\) 正整數序列 \(a\),滿足恰有 \(k\) 組無序正整數對 \((i,j)\),滿足 \(\max(a_i,a_j)\)\(\min(a_i,a_j)\) 的倍數。你需要保證 \(a_i\le 2n-1\)

部分分:\(k=0\)\(k\le n-1\)

先考慮 \(k=0\) 怎麼做,顯然就是要構造所有數都互質。直接從 \(n-1\)\(2n-1\) 即可。

\(k\le n-1\):這是比較難的部分。

我首先想到:構造一系列類似 \(x,2x,3x,...,px\) 的東西,每個代價是 \(\frac{p(p-1)}{2}\)。每次二分最大的 \(p\),讓 \(k\) 不斷逼近 0 即可。

但是這樣細節比較多而且沒有很快的找 \(x\) 的方法。並且還有一個最大的問題:可能構造的 2 組互相滿足了倍數關係!直接完蛋!

\(k\) 不斷逼近的思想是好用的。要最佳化我們的構造。

注意到題目沒有讓所有數不同。很快地想到等效構造:\(p\)\(x\)

如何使得這些 \(x\) 互質?使用 \(k=0\) 時構造的那些數即可。

到這裡就解決了 \(k\le n-1\) 的問題,對於 \(k\ge n\) 的部分,我們自然嘗試將 \(k\) 變小直到 \(k\le n-1\)

一個觀察:如果一個數對中有 \(1\),那麼其一定有貢獻。

每向序列中加入一個數 \(1\)(假設現在一共有 \(i\) 個),就會帶來 \(n-i\) 的貢獻。

一直加入 \(1\) 直到 \(k\le n-1\),此題解決。

此題的思考方向\(k=0\)\(k\le n-1\) 的構造 -> 構造操作使得 \(k\le n-1\)


P11145

\(m\in [2,10^{17}]\) 未知,你需要詢問不超過 2 次來確定 \(m\)。每次詢問給出 \(x\in [0,10^{18}]\),返回 \(x\bmod m\) 的值。

一個性質:當 \(x<m,x\bmod m=x\)

所以可以二分 \(x\) 來詢問,找到最大的 \(x\bmod m=x\)\(m\) 既是 \(x+1\)。該方案詢問次數:\(\log V\)

注意到 \(x\) 上限比 \(m\) 大。直覺告訴我們詢問的 \(x\) 必須非常大。(嘗試構造小的 \(x\) 無果)

又一個性質:\(m\mid (x-x\bmod m)\)。這裡的限制就非常強了!我們只需要讓兩次詢問的 \((x-x\bmod m)\) 的公因數唯一,就解決了!

事實上,這樣的 \(x\) 是不好找的。放棄這個方法。

不妨先詢問一次得到:\(m\mid (x-x\bmod m)\)。把後面那個東西減一,有:

\[(x-x\bmod m-1)\equiv (m-1)\pmod m \]

所以第二次詢問必定會返回 \(m-1\),此題結束。

此題的思考方向:先詢問使得 \(m\) 是一個數 \(k\) 的約數 -> 發現 \(k-1\) 返回的是 \(m-1\)


P11132

構造一個 \(n\) 階排列,使得排列中:“所有的 \(n - m + 1\) 個長度為 \(m\) 的連續子串內最大值的最大公因數。”最大。

突破口:最大值。

必然有一些子串的最大值是 \(n\)。所以我們就需要讓其他子串的最大值都是 \(n\) 的約數。

先判掉把 \(n\) 放到中間就是所有子串的最大值的情況。

我們肯定希望這個 gcd 是 \(n\) 的不包含自身的最大因子 \(x\),並且不能比 \(m\) 更大。下面給出一種構造方案證明一定可以。

首先我們需要所有子串的最大值都是形如 \(kx\le n\) 的形式,貪心地讓他們相隔儘量遠,都放在 \((k-1)m+1\) 的位置。

然後我們只需要把剩下的數放進去,並且使得他不是任何一個子串的最大值即可。從小到大放就可以了。

為什麼這樣一定可行,首先由於 \(x\mid n\),所以每一段的大小都是相等的,每一段的第一個位置都是 \(kx\),這一段後面跟的數都小於它,所以最大值也沒有被替代。

舉例:

\(n=12,m=3\),構造如下:

\(*3,1,2,*6,4,5,*9,7,8,*12,10,11\)

注意標星號的位置,看看他們是不是完全包含了所有子串的最大值。

此題的思考方向:最大值 -> 列舉 \(n\) 的每個約數判斷是否合法 -> 發現 \(n\) 的最大不超過 \(m\) 的約數一定可以構造。


P11036

給定正整數 \(a\),構造三個正整數 \(b,c,d\) 使得 \(a+b+c+d=\gcd(a,b)+\operatorname{lcm}(c,d)\)。你需要保證 \(b,c,d\le 1\,634\,826\,193\)

首先嚐試:\(b=1\),那麼要求:\(a+c+d=\operatorname{lcm}(c,d)\)

自然地想到讓 \(c,d\)\(a\) 有關,最好右邊是個 \(2a+k\) 的形式。那麼構造:\(c=2,d=a+2\)。這組構造當 \(2\nmid a\) 時成立。

自然考慮 \(2\mid a\) 的情況。其它做法留給打表哥。

類似 P11277 的思想:能不能回到 \(2\nmid a\) 的情況?比如,我把 \(a\) 拆成:\(2^w\times k\),滿足 \(k\) 是奇數。顯然一定可以拆成這樣的形式。

\(c,d\) 都調整:\(c=2^{w+1},d=2^w\times k+2^{w+1}\)。帶入原始式子:

\[2^w\times k+2^{w+1}+2^w\times k+2^{w+1}=\operatorname{lcm}(2^{w+1},2^w\times k+2^{w+1}) \]

不難證明後面的 lcm 的結果是:\(2d\)。把 \(a,c,d\) 帶進去:

\(a+c+d=2d\)

顯然 \(a+c=d\),於是得證。

此題的思考方向數學直覺 先確定難搞的 gcd,考慮 lcm -> 發現構造只滿足 \(2\nmid a\) -> 構造 \(2\nmid a\) 的情況。


P11022

小 R 有一張 \(n\) 個節點和 \(m\) 條的邊簡單無向圖,節點的編號依次為 \(1 \sim n\)。她想要為圖中的每個節點分配黑色或白色的顏色,使得:

  • 有至少 \(1\) 個黑色節點和 \(1\) 個白色節點;
  • 對於任何一對點對 \((u, v)\),只要 \(u\)\(v\) 的顏色不同,就存在至少 \(2\) 條從 \(u\)\(v\) 的不同的簡單路徑。

突破口:至少 2 條路徑。想到構造一個環(\(\ge 3\)),只要兩點之間的路徑要經過環,那麼他們就一定有 2 條以上的路徑。

我們發現如果這個圖沒有環一定無解。

一個環把整個圖劃分成了若干個不相關的子圖,我們想到讓每個子圖顏色相同。這樣內部就不用管了。

考慮結合起來,環上每個點的子圖交替染色即可。

考慮一種特殊情況:環上一個點 \(x\) 的子圖和環上另外一個點 \(y\) 相連。此時如何染色?

讓這個子圖和 \(y\) 斷開,即使得 \(x\)\(y\) 的子圖染不同顏色,並欽定這個子圖不屬於 \(y\) 的子圖。

容易證明這樣構造合法。上述情況本質上是環上接了另外一個環。

此題的思考方向:參照環 -> 環外所有子圖內部染相同顏色 -> 結合起來交替染色。


P10678

給定正整數 \(n\) 和每個點 \(i\) 的度數 \(d_i\),你需要構造一棵樹,最小化其直徑。

很容易想到菊花圖的構造方式。麻煩的是對於每個點的度數的限制。

先把類似題掛上來:CF1092E


CF1990C

很多題目都滿足一個性質:操作若干次後恆不變。根據這個可以秒掉一堆 Ad-hoc 題。這個題雖然只有 *1500,但其每次操作都有一定的變化,只不過變化是有規律的。較前面那種純模擬題要有趣一些。

打表發現:原陣列操作常數次後形態變化穩定。

於是先暴力操作常數次,然後觀察後面每次操作如何變化。

自己構造一組數量級在 10 左右的資料並打表,發現每次數的種類和相對位置不變,整體向右平移 1,超過 \(n\) 的位置永遠消失。

然後就可以統計貢獻了,這個不是本題的難點。

此題的思考方向:操作若干次後陣列穩定 -> 觀察每次操作的變化 -> 維護貢獻。