T1:若\(x\)存在一個約數\(y\)滿足\(y\)的十進制表示有\(7\),那么\(x\)就是不好的,\(T\)次詢問給出\(n\),詢問大於\(n\)的最小的好數。\(n<=10^5,T<=10^7\)。
解法:類似篩法的思路。先預處理\(b7(x)=b7(x/10)||(x\mod10==7)\),表示\(x\)的十進制中有無\(7\)。
對於\(b7(x)==true\)的\(x\),把\(x\)的倍數標記。注意如果一個數被標記了就不用標記他的倍數了。
時間復雜度約為\(O(n\ln\ln n)\)。
T2:給出\(n,m,k\),若數組\(a\)滿足\(\sum{2^{a_i}}\)的二進制1的個數不超過\(k\),就是合法的。數列\(a\)的價值為\(\Pi v_{a_i}\)求合法數列價值和。
暴力:\(O((m+1)^n)\),可以獲得\(30\)分。
可以發現這是一個背包問題,設\(f(i,j)\)表示前\(i\)個數\(2^{a_x}\)的和為\(j\)。時間復雜度\(O(n^2m2^m)\),結合暴力可以獲得\(60\)分。
首先,看到二進制,考慮\(DP\)。我們按照\(a_i\)從小到大的順序枚舉,並記錄未確定的元素個數,進位值以及已確定的二進制1的個數。
設\(f(i,j,x,s)\)表示考慮到數組\(a\)中等於\(i\)的元素,剩下\(j\)個,進位為\(x\),有\(s\)個\(1\)。
枚舉等於\(i\)的有\(y\)個,轉移到\(f(i+1,j-y,\frac{x+y}2,s+(x+y)\mod 2)\times C(j,y)\times{v_i}^y\)。
時間復雜度:\(O(n^4m)\)。稍稍注意常數即可。
T3:給一個遞增數列\(a\),每次可以使\(a_i\)變為\(a_{i-1}+a_{i+1}-a_i\),求最小方差。
先差分。設\(b_i=a_{i+1}-a_i\)。那么對於\(a,a+x,a+x+y\)操作后變成了\(a,a+y,a+x+y\),發現交換了兩個差分值,
那么我們暴力枚舉\((n-1)!\)種最終的差分數組,即可得到\(20\)分。
不難發現方差可以用總和與平方和表示。
設\(m=\max{a_i}\),我們可以通過狀壓枚舉全排列。設\(f(S,x)\)表示已經用的集合為\(S\),前綴的和為\(x\) 的最小平方和。復雜度為\(O(n^2m2^n)\),可以獲得\(32\)分。
由於是最優化問題,可以考慮模擬退火,得分約為\(72\)分。
通過找規律可以發現,最優解的差分一定先減后增。那么我們把\(b\)排序,從小到大考慮放到左邊還是右邊即可。
設 \(f(i,x)\)表示前\(i\)小的數,前綴的和為\(x\) 的最小平方和。設第\(i\)個數為\(y\),前\(i\)小的差分和為\(z\)。
放到右面:轉移到\(f(i+1,x+z)+z^2\)。
放到左面:轉移到\(f(i+1,x+i\times y)+2xy+y^2i\)。
把數組中的\(0\)扔掉,復雜度為\(O(\min\){\(n,m\)}\(\times nm)\)。
T4:題意略。
暴力就是分4次,每次只考慮一種邊bfs即可。時間復雜度\(O(nmq)\),期望得分\(24\)~\(32\)分。
只有普通道路的情況直接查詢4個點即可。期望得分\(8\)分。
沒有互通道路的情況,用並查集維護一個點上下左右能走到的最遠點,能吃到棋子最多4個,暴力檢驗即可。期望得分\(12\)分。
結合上述 做法可以獲得\(52\)的高分。
滿分做法:
首先時間倒流,變為合並問題。
對於每個3道路構成的連通塊,用線段樹按照等級維護它周圍的棋子。
同時,用並查集維護聯通塊的點數。
合並時進行線段樹合並或啟發式合並即可。注意一個點沒有棋子后要把它從周圍的線段樹中刪除。
同時注意相同位置上的棋子合並時不要算重,這個可以在葉子結點使用\(set\)實現。
對於2道路的問題,還是用並查集維護一個點上下左右能走到的最遠點。
查詢時,分為不吃與吃兩種情況:
不吃:把3和2的點數加到一起,然后把重復的減去。
這個需要對每個聯通塊,每行開一個線段樹,按照列維護。列的線段樹同理。加點時線段樹合並即可。
吃:直接在聯通塊維護的線段樹上查詢前綴和即可。
使用1,2道路的最多有8個點,暴力計算有幾個不能只通過3道路吃掉即可。
注意代碼復雜度較高。
時間復雜度\(O(K\log K)\)或\(O(K\log^2K)\)。