1. 程式人生 > >TopCoder SRM 刷水

TopCoder SRM 刷水

最長 2.0 return 標記 復雜 真的是 最小值 closed opc

怎麽樣快速提高姿勢水平呢?自信說應該做TopCoder!

於是我就看到了很多XJOI題,BZOJ題……好像可以搬些題呢!

簡單整理一下,方便未來搬題(霧

462C:先考慮從某個點出發,其出邊有不能走的邊,到終點距離在最壞情況下的最小值。再考慮從某個點出發,還不知道不能走的邊在哪時,到終點距離在最壞情況下的最小值。前者枚舉每條出邊跑最短路,後者反著跑最短路,然後和前者的答案取較大值。

463C:BZOJ2454,一個點最多只有三種轉移,某些情況下只有兩種,如果以這些點為根來看,整個轉移的結構就是一個無向的二叉樹。如果 兩個狀態 到 從起點到終點的路徑 距離相同 且 到起點的距離相同 且 到根的距離相同,那麽這兩個狀態對答案的影響是沒有本質差別的,可以合並

464C:用\(f_{S,i,x,y}\)表示在\((x,y)\),已知\(S\)集合中的顏色是安全的,\(i\)這個顏色危險的,不經過危險的地方到達終點的概率。用\(g_{S,x,y}\)表示在\((x,y)\),已知\(S\)集合中的顏色是安全,最多經過一次危險的地方到達終點的概率。前者用類似最長路的方法從終點開始擴展著跑,後者結合前者的結果來跑

465C:註意到如果某個點離終點的距離是小於等於\(d\)的,那麽它到達終點的概率就一直是\(frac{1}{d}\)的。也就是說如果走了\(n\)步後,每步獲勝的概率是一定的,那麽只要求出前\(n\)步每個人獲勝的概率就行。這玩意直接對兩個人分別上dp

466C:考慮哪些黑色格子被剩下了,然後跑容斥,考慮哪些黑格子被選了,直接求答案

469C:註意到對於任意一種方案兩個人不可能都棄療,那麽只要用總方案分別減去兩個人不合法的情況。什麽時候會不合法呢,令\(x\)為J先審的電影,\(y\)為B先審的電影,\(sum = \sum_{i=0}^{totx}{timeJ_{x_i}, minlow = \min_{j=0}^{toty-1} ( \sum_{i=0}^{j}({timeJ_{y_i}-timeB_{y_i}}) - timeB_{y_{j+1}} ) } \) 那麽只有 \(sum + minlow < 0 \)時才會不合法,那麽只要看每本電影是給第一個人呢,還是給第二個人,更新一下\(sum\)和\(minlow\)就行了

471C:聽說TC會出模擬退火?

472C:一道大分類討論題……

473C:令\(f_{c,x,y}\)表示\(c\)種顏色的車占領了\(x\)行\(y\)列的方案,\(g_{n,x,y}\)表示\(n\)輛同樣顏色的車占領了\(x\)行\(y\)列的方案,後者用容斥搞,前者用後者搞

475C:註意到如果某個集合可以被選中,那麽其中的兔子都可以視為選到了最大值,其余的兔子都可以視為取到了最小值,這樣就不用考慮每只兔子有多種的得分的可能性了。為了避免重復計數,枚舉集合中的最小值,大力DP即可

476C:對於樹邊,向根的方向的船的個數要大於等於\(crewSize\)。對於環邊,向左走到環頂的最小值加上向右走到環頂的最小值之和要大於等於\(crewSize\),記錄當前向左走的最小值就可以dp了

477C:對於一棵子樹來說,最多只有一條邊從其中連出去,因為子樹的父邊一定得走。那麽直接紀錄有沒有邊就可以樹D了

478C:分別考慮每箱蘋果的貢獻。對於一種選取箱子的方案,影響它對答案的貢獻有:這箱蘋果有沒有選,剩下選了的蘋果的總個數。於是只要求出不取某箱蘋果,但總蘋果數為\(x\)的方案數。因為蘋果箱子的順序與總的結果是無關的,所以可以把這箱蘋果看成是最後轉移的,這樣只要跑一個轉移的逆過程就行——就是一個差分

479C:每個人最多只能被卡住一次……

480C:靠慮反向的過程,第一次操作後序列會變成若幹段連續的數字。註意到一段連續的數字最多被切開一次,記錄一下上個數字是啥就可以dp啦,註意不能有前導零啥的

481C:二分答案,這樣的話只要在每次轉移之前判斷一下能不能在結束前做完,就可以扔掉打印機移動的時間。直接跑狀壓dp,用\(f_{i,j}\)表示當前在\(i\),而啟動的打印機集合為\(j\),合法的最短時間

482C:沒有標記的砝碼之間的和差 都是可以介出上下界的,直接在未標記的砝碼的周圍尋找有沒有解

483C:這題非常exciting/二分答案是有反例的。更大的船可能不會更優……但是註意到兩艘船的載重量之差如果大於等於了最重的,那麽較大的船一定較優。於是可以二分出一個大致的解,然後暴力向上掃一掃即可。

484C:怎麽樣區分出兩個數?只要有一張卡上一個數出現了一個數沒出現即可。於是考慮這樣一種貪心:把一個數放進0張卡中,把若幹個數分別放進1張卡中,把若幹分別放進2張卡中……這樣做可以保證卡上的數字總量最少,並且每張卡上的數字個數是差不多的。二分答案即可

487C:講道理這場的C比B要簡單(捂臉)。這題真的是突破天際啊……

技術分享
1 int getNumber(int m, int n)
2 {
3     f[0] = f[1] = 1;
4     for (int i = 1; i <= n; ++ i) f[i] = (0ll + f[i - 1] + f[i - 1] - (i == m) - (i - m - 1 < 0? 0: f[i - m - 1]) + MOD) % MOD;
5     return (f[n] - f[n - 1] + MOD) % MOD;
6 }
View Code

488C:列出不等時候大力討論

489C:BZOJ????,考慮從小向大插入每一棵樹,那麽被覆蓋的面積是可以被確定的,於是就是一個插頭dp狀物。

490C:你看橫行這麽窄,直接上倍增!用\(i,j,k\)表示從第\(1\)個矩形的第\(1\)行第\(i\)列,走到第\(k\)個矩形的第\(r\)行第\(j\)列的最短距離

491C:二分答案,匹配建圖,大力跑費用流

492C:把圖建的好看科學點,跑dij

493C:大力dp咯,狀態是有四種的(捂臉

494C:高斯消元求自由元數量

495C:一種方案可以停靠的位置是分層的,是一種大循環節內有小循環節的結構,然後有兩種層(畫圖可知)。於是只要記搜就行了

496C:考慮把這個哈密頓路徑補成哈密頓回路,可以證明將0,1放在一起的哈密頓回路和最優的哈密頓回路是一樣長的,那麽只要貪心就行了

497C:BSGS。可以求出 \(0k\) ~ \(mk\) (\(m\)是一個任取的數)每一項的值,那麽在 \(ik\) ~ \((i + m)k\)中符合條件的那些數肯定對應了其中的幾段權值區間,二分出邊界即可

498C:如果不考慮壞點的話,行列可以分開dp。考慮壞點的話,就是加一個dp+容斥,把不合法的情況給roll掉

499C:A,B,C,D個數相同的串都可以互相達到,因此根據字符的個數來建邊,然後上tarjan+DP

500C:枚舉9 6 8 4的個數,就可以得到所有情況,用組合數得到答案

501C:大力dp咯

502C:BZOJ4314 ,先把集合考慮成排列,最後除以\(n!\)可以得到答案。對於沒有限制的情況,前\(n-1\)個數可以隨便選,最後一個數補成整除。用\(f_{n,m,k}\)表示\(n\)個數,有\(m\)個數和最後一個數是相同的,和被\(k\)整除的方案數。用類似補集轉化的方式轉移,式子太長太鬼畜寫不下(捂臉

503C:大力dp咯,仔細實現即可

504C:以C分段,按區間考慮

553C:二分環長,建差分約束,如果有負環就是不合法的。如何知道當前環長是否太長?只要看負環中環的系數就行了,看它是正的還是負的。

554C:裸的矩陣快速冪

555C:對於某個起始位置,考慮那些修改結果與最終結果沒有矛盾的時刻,越晚的時刻合法的位置顯然較多,且包含較早的時刻。於是可以得到指針如果從某個位置開始,那麽哪些位置必須要被事先塗上顏色。統計有重復?直接上容斥~

558C:BZOJ3774(膜拜一下建圖即可AC

559C:考慮圓上的某點到另一個圓的最短路徑。它要麽是該點向圓心方向引出的一條線段,要麽是一個沿圓周走一段再沿著公切線走。於是可以二分答案,然後判斷圓上的哪個區域是合法的。

560C:如果和式中如果有\(ab\)這麽一項,那麽通過調整法可以證明\(a\)、\(b\)至少要有一個數達到了上下界。於是可以枚舉每個數有沒有達到邊界,這樣的話和式中的每一項都至少被確定了一個,這就成一次函數的極值問題了

561C:這玩意是棵樹,然後就沒有然後了

562C:分\(k*2 \leq n\)與 \(k*2 > n\) 兩種情況討論一下

563C:用類似圖哈希的方法知道每個位置的hash值,判斷哪些位置是等價的

564C:如果沒有限制的話,可以先隨便選前\(n-1\)個數,最後一個數配平。於是從高向低位枚舉每位的時候只要一個數沒有達到上界,那麽其他數就可以隨意選了。

565C:ABC三個點構成的虛樹要麽是一條鏈,要麽是星形的,分類討論一下即可

567C:情況數少,記搜可過

568C:有兩種暴力1.枚舉剩下的元素,某些匹配不能放在一邊,這是個黑白染色問題,bfs判斷是否合法 2. 枚舉當前已知的每對匹配是向哪個方向連,然後就可以得到一些限制,某個區間向上連的線的條數的奇偶性,用bfs判斷是否矛盾。合起來就行了

569C:肉眼觀察法,對了有個式子很有趣\(\lfloor \frac{ans}{k} \rfloor \mod p = (ans \mod p - ans \mod k) * k^{-1} \mod p \)

570C:基佬題(霧,膜拜一下建圖即可AC

571C:每個盤子上能到達的區域是個區間,直接SPFA

572C:若有解,則可以將兩個字母環分別展開成鏈,並且對應關系不相交。暴力枚舉展開方法後貪心即可,註意合法性

578C:首先暴力枚舉一條將兩棵子樹分開的一條邊,令\(f_{i,j,k,l}\)表示 以\(i\)為父親的\(j\)這棵子樹 與 以\(k\)為父親的\(l\)這棵子樹 匹配的答案,轉移的時候直接跑 KM,時間復雜度\(O(n^5)\)

583C:令\(P_i\)為\(i\)次操作後仍未結束的概率,那麽就有答案\(ans=\sum_{i=0}^{\infty}P_i\)。考慮容斥,令\(Q_S\)為\(S\)這個行列集合沒有被選中的概率,則有\(P_i=\sum_{S}{(-1)^{|S|}Q_S^i}\),帶入可以得到\(ans=\sum_{S}\frac{(-1)^{|S|}}{1-Q_S}\),然後就可以大力狀壓dp了

TopCoder SRM 刷水