省選模擬101 題解

2022-03-16 18:16:08 字數 1624 閱讀 8648

a. 石子遊戲

問題可以簡單轉化為最少能取出多少個數,使得異或和為 \(k\)。

顯然答案是小於 \(log(a_i)\) 的,因為線性基已經可以拼出所有數了。

所以可以考慮列舉這個答案,然後就是 \(dp_\) 表示用 \(i\) 個數能否拼出 \(j\)。

轉移可以用 \(fwt\) 優化,暴力做就是兩個 \(log\) 的,因為只需要一項所以手動 \(ifwt\) 可以做到乙個 \(log\)。

b. 函式

看到這題有點眼熟,是一道用 \(powerful \ number\) 來做的題。

\(powerful \ number\) 大概就是指每個質因子次數都 \(\geq 2\) 的數,可以計算出這樣的數個數是根號級別的。

如果原函式為 \(f\),構造乙個積性函式 \(g\) 滿足 \(g\) 函式只在 \(powerful \ number\) 處取值不為 \(0\)。

乙個積性函式 \(h\) 滿足字首和易於計算,然後使得 \(f=g*h\)。

因為 \(f_p=g_p*h_1+g_1*h_p=g_p+h_p=h_p\),所以 \(h\) 一般就是個滿足質數處取值與 \(f\) 相同的多項式函式。

這樣的話依次把 \(f_,f_...\) 展開差不多就能得到 \(g\) 的表示式。

化一下 \(f\) 字首和式子就發現,搜這個 \(powerful \ number\) 出來然後乘 \(h\) 的字首和就好了。

c. 畫

首先不考慮邊的限制,然後這道題的做法是給定若干個 \([0,r_i]\),求異或和為 \(c\) 的方案數。

也是一道見過的題,然後乙個比較優秀的 \(o(nlog)\) 的解決辦法是這樣的。

從高到低考慮每一位,此時滿足每個數的高位全部貼緊限制,如果這一位上有乙個數沒有貼緊限制,那麼這個數的低位就可以隨便選來滿足異或和為 \(c\)。

所以對於存在不貼緊限制的方案,寫乙個 \(dp_\) 表示前 \(i\) 個數,是否存在不貼緊限制的數,當前異或和就解決了。

否則全部貼緊限制,可以直接進行下一位。

然後對於存在邊的限制,乙個暴力點的想法是欽定不滿足條件的邊集。

相當於是形成了若干個強制相等的連通塊,然後就用乙個子集反演。

然後用 \(dp\) 優化一下這個暴力欽定的過程,改為每次加入乙個點集,然後順便計算出每個點集聯通的方案數即可。

因為這個 \(dp\) 要記錄已經考慮的點集、已經考慮點集中存在的有效權值。轉移還得再列舉超集,所以複雜度看起來很高。

其實有效的狀態數並不多。考慮首先把點集按照 \(r_i\) 的大小排序,那麼每次取的就是點集中編號最小的點。

把這樣的編號最小的點染色為 \(2\),已經考慮的點染色為 \(1\),還沒考慮的點染色為 \(0\)。

那麼對於最靠右的 \(2\),左側只有 \(1,2\),右側只有 \(0,1\),所以狀態數是 \(o(n*2^n)\) 的。

總複雜度可以寫為 \(\sum \limits_^n 2^\sum \limits_^\binom2^j=\sum \limits_^n 2^3^\)。

把 \(3^\) 拆成 \(3^n3^\),然後用等比數列求和一下就可以發現總複雜度是 \(o(3^n)\) 的。

還有乙個問題是如何壓 \(3^n\) 的狀態, dc 大神告訴我們分別將二進位制表示三進製化然後相加就好了。

省選模擬104 題解

a.簽到題 把每個點向它右側比他大的第乙個點之間連邊,如果沒有那麼向 root 連邊。那麼可以構成一棵樹。特判一些情況之後,可以認為問題就是 1.給某節點和它的所有兒子節點權值加上乙個值。2.詢問一條路徑的權值和。首先考慮如果只詢問單點的維護方法,其實就是打乙個標記表示給整個兒子集合都加上了若干權值...

省選模擬102 題解

a.island 對於正負不同的情況,o n 列舉左側的位置然後計算。對於正負性相同的情況,把笛卡爾樹建出來,然後每次考慮跨過最小值的貢獻。分幾種情況 左右均不超過最小值,左右僅有乙個超過最小值,左右都超過最小值。然後順便統計上其中乙個端點為劃分點的貢獻。然後瘋狂的寫式子拆式子就沒了。做法挺簡單的,...

省選模擬100 題解

a.小b的棋盤 這種方案不好列舉的題的乙個解決方案就是考慮怎樣的方案是可能合法的。如果 k geq n 那麼一定無解,否則可以找到至少一組點的中點來表示最終的答案。容易發現取 k 1 個點至少存在乙個能匹配到的,所以複雜度可以做到 o n 2 k 如果判斷一下每個中點出現的次數,可以做到 o n 2...