論弱逼的自我修養——2014集訓隊CF試題泛做

爲了增長姿勢水平提高思考能力,我決定跟着神犇膜一膜2014的集訓隊作業;

似乎大多數是CF上的DE題,應該比較有含金量(然而博主是個div2連D都沒做上過的**);

感覺不久就會棄坑吧,大家來猜猜窩能堅持幾道題吧!


現在做了45/102


仿照各位神犇的風格寫寫一句話題解吧,如果我想詳細寫的話大概會扔個鏈接騙訪問量吧= =;


2015/12/9 UPD:目前22題

最近開始複習文化課啦,回去補習文綜理綜啥的這邊的效率基本是完了的;

總之能做一些就做一些吧。。。哪怕是都膜題解出也大概有點用吧(笑);


2015/12/21 UPD:目前28題

文化課暫且圓滿滾粗,回來刷刷題啦~

不過感覺這個節奏藥丸,並不能自己做出來題,智商果然還是掉沒了(原來就沒有哇!);


2015/12/24 UPD:目前36題

感覺這個節奏已完哦,似乎離上次UPD這些題都不能自己做出來。。

似乎也有好多不太難的題因爲慣性就去看題解了= =,這可不好是吧。。。

我什麼時候能達到會做幾道題的程度呢[捂臉熊];


1.CF263E

先暴力算出來一個菱形,然後向旁邊轉移,轉移就是加兩個三角形減兩個三角形,用三個前綴和算;


2.CF293B

首先n,m都不會太大,然後搜索;

用狀壓維護這個點不能選哪些顏色,並且對於沒被輸入固定過的顏色每個點只取最小的顏色,然後搜索出來的方案之後累加一個奇怪的組合數;


3.CF235E

WJMZBMR場的神題,rng_58的這個公式簡直感人至深;

總之我還是膜題解搞了個公式。。

然後就枚舉i反演一下照着題解搞一搞就可以了,時間複雜度O(n^2logn);


4.CF325E

找規律發現奇數一定無解,然後考慮從0倒着找,那麼每次的前驅可能是(x+n)/2或者x/2,;

觀察大樣例發現優先找(x+n)/2靠譜,寫一發A了;


5.CF260E

首先暴枚排列⑨!然後在前綴和二分找到四條直線,但是這四條直線僅僅滿足了條件的一部分;

然後再利用可持久化線段樹維護矩陣元素個數,check一下這些直線是否合法就可以了;


6.CF325D

先將矩形複製一次,然後就是查詢複製之後的點是否與原點連通,用並查集維護即可;


7.CF335E

http://blog.csdn.net/ww140142/article/details/50109689


8.CF360E

首先可以利用任意次操作拼出a的k*gcd(b1,b2...bm,p-1)冪次的數(k爲任意非負整數);

然後令ai=g^ri,g爲mod p 意義下的原根,那麼原問題轉化成了求k*ri*gcd(b1,b2...bm,p-1)的集合大小;

DP一下:

累加所有的f[i]即爲答案;


9.CF339E

似乎有一種神奇的構造姿勢能做到O(n),不過看不懂我選擇爆搜。。每次找出一段abs(a[l]-a[r+1])==1||abs(a[r]-a[l-1])==1的區間反轉然後遞歸搜索就可以了;

原因就是任何方案都一定將連在一起的元素又接回一起去,這樣可以剪枝掉很多情況;


10.CF286E

http://blog.csdn.net/ww140142/article/details/50128923


11.CF332D

因爲數據保證這樣的點只有一個,那麼對每條邊計算貢獻就可以了;

對一個度數爲D點的某條權值爲val的邊,貢獻是C[D-1][k-1]*val,最後一起除C[n][k],用double型存儲精度似乎就夠了;


12.CF335D

預處理格子的前綴和,以及在矩形內部小線段的前綴和,對於一個正方形只要判斷它是否被填滿,並且邊界上沒有矩形內部的小線段即可;

枚舉每一個矩形的左下角,枚舉長度然後O(1)判斷這個正方形,注意枚舉過程中的剪枝;


13.CF261D

首先讓t=min(t,n,bmax),因爲答案最大也不會超過min(n,bmax),然後整個序列長度就不會超過2*10^7了,枚舉每一個數然後DP,f[i]表示DP到當前位置最後一個數字不超過i的最長長度;

顯然f[i]單調遞增,於是每次更新只是更新連續的一段,又因爲每次f[i]值至少+1,所以更新次數不會很大,時間複雜度就有保證了;

(說起來似乎還有一道用倍增floyd解決不下降子序列的CF題吧。。很久以前坑下的一道題還沒填。。)


14.CF235C

http://blog.csdn.net/ww140142/article/details/50151235


15.CF311E

最小割模型,考慮將每個點劃分到S集爲公,到T集爲母,那麼按此連一條流量爲這個狗手術代價的邊;

對每個人新建一個點,如果他希望將狗變公,從S到這個點連一條流量wi+這個人是否是好友*g的邊,並且向每個他希望的狗連INF的邊;

將所有的wi加起來減去最小割即爲答案;


16.CF306D

n<=4的時候無解,其他情況因爲角度已經確定,我們只要構造一個離正n邊形差一點的圖形即可;

調整長度,第i條邊的長度爲500+0.01i,最後兩條邊求交就是最後一個點啦;

(過不去的時候調調參數是很機智的選擇)(學習了一下python輸出圖像的姿勢)


17.CF249E

公式題,轉化成矩形前綴和之後把前面的小正方形和後面的剩下的東西搞一搞就行了;

然而這題取模啥的比較變態。。所以我選擇python被卡常,然後膜了一下杜教的公式A了= =;


18.CF295D

題意很難的題。。。我真心看不懂題意去看了題解= =然後發現就是挖一個洞。。

然後DP一下就好了,f[i][j]爲高度爲i長度從j開始的半個洞的方案數,sum1[i][j]爲f[i]數組對第二維的前綴和,sum2[i][j]爲f[i]數組對第二維*j的前綴和;

利用前綴和轉移再統計一下就可以了,兩個前綴和主要是爲了解決上一層長度k比這一層長度j小,所以方案要乘一個(j-k+1);


19.CF264E

這個東西感覺並不能用數據結構優雅的維護,但是題中有兩個重要的條件xi,hi<=10,提示我們可以暴力搞一搞;

於是反向求LIS,每次把最下面/最左面的十個拿出來暴力重構就可以了,開兩個線段樹維護,時間複雜度O(nlogn*10);


20.CF286D

http://blog.csdn.net/ww140142/article/details/50173971


21.CF258D

考慮這個狀態:f[i][j]表示pi>pj的概率,初始值掃一遍,每次操作交換x,y,那麼就是f[i][x]=f[i][y]=(f[i][x]+f[i][y])/2,f[x][i]=f[y][i]=(f[x][i]+f[y][i])/2,f[x][y]=f[y][x]=0.5;

這個可以O(nm)的算出來,算出來之後根據定義,∑f[i][j]  (i<j)就是答案了;


22.CF273D

將問題轉化一下,變成染一個區域,使其左邊界和右邊界都是凸的,按照vfk的題解,我們可以像判定合法性一樣,用一條線從上往下掃,然後DP;

f[i][l][r][j][k]表示DP到第i行,這行染黑的區間是[l,r],j=左邊界是否下降過,k=右邊界是否下降過,這個方程可以用前綴和優化,時間複雜度就是O(n^3)的了;


23.CF283E

http://blog.csdn.net/ww140142/article/details/50241077


24.CF305D

首先這個圖中不可以存在x連向x+1或x+k+1以外的邊,並且對於所有的x<n都有x連向x+1;

那麼考慮能放多少x+k+1的邊,然後記錄所有這樣邊的前綴和搞一搞就好了;


25.CF354D

考慮如果選了一個高度h的金字塔,那麼一定滿足h*(h+1)/2+2<3*m,因此選的高度一定小於O(√m);

那麼直接在高度較低的地方DP就可以了,具體方法我去膜了ydc的代碼感受一下啦。。。


26.CF261E

以前NOIP模擬賽的時候做過,就是發現能組成的數不超過3*10^5個,於是搜出這些數;

然後枚舉右側加的次數i,計算每個數最少用多少次乘法算出,f[x]+i<=n的話就可以被表示出,時間複雜度O(3*10^5 * n);

有點卡常。。


27.CF253E

首先這東西可以二分。。然後就是模擬啦。。。複雜度O(nlog^2n)不虛哦;

注意這個權值不可以重複,所以我預先處理了所有的可選值,還有二分之後要再調用一次check函數,算一遍任務完成的時間;

別忘了是讀取文件哦;


28.CF309E

二分+貪心,然而我並不會證明所以就說一下做法吧:二分之後,我們考慮如何構造一組解或判斷不存在;

定義一個數組lim[x]表示x這個區間最晚在排列的什麼位置,這個每次暴力維護,然後對於要填的每個位置,統計lim小於等於某個數的區間數;

找到一個最小的t滿足恰好能將這些區間一一對應前t個排列的位置,然後在其中找一個右端點最小的放在i處就可以了,如果放不下就是無解,時間複雜度O(n^2logn);


29.CF316E3

有一個神奇的式子呢:

fib[0]=0,fib[1]=1,以下遞推(和題中不一樣),證明腦補吧。。

然後根據這個式子,就得到了線段樹結點信息合併的方法,預處理fib數列及其前綴和,在線段樹上做修改就可以了;


30.CF243C

搞一個離散化然後暴力就可以了,複雜度O(n^2);

亂寫然後就A啦。。然而調代碼的時候output和answer看反調了半天= =;


31.CF316G3

以前學習後綴自動機的時候研究了一下這道題然後跑了,現在滾回來把它搞完;

就是將所有的串建立一個廣義後綴自動機,對於每個後綴結點記錄它在每個串中的出現次數;

然後掃一遍所有的點,將滿足條件的並且在原串中的子串累加答案就可以了;


32.CF256D

考慮DP,設f[i][j][k]表示前i個數已經用了j個人,並且其中k個人一定說謊的方案數;

轉移枚舉多少人說這個數:有f[i+1][j+l][k+(i+1==l?0:l)]+=f[i][j][k]*C[j+l][l],C[n][m]表示組合數;

因爲O(n^4)過不去所以後面的打表= =,這思路什麼鬼啊。。。


33.CF303D

結論題。。看起來有點像數位DP之類的東西結果居然是數論?

總之當長度n>=2時,進制b下有且僅有一個循環數的充要條件是n+1是質數,且b是n+1的原根(證明在vfk的集訓隊作業裏);

然後直接暴力求原根就可以了,注意一些邊界情況如n==1,x==2什麼的= =;


34.CF338D

首先考慮這個數列會出現在第幾行,設數列的LCM爲h,那麼一定會出現在k*h行上,而實際上,h行的循環節一定是在k*h行循環節的子串,所以我們可以確定它出現在h行;

考慮列的話,設從第l列開始可以列出方程l=1-i (mod a[i])    (1<=i<=n),求解這個方程組即可,同樣是取最小的l;

那之後暴力判斷即可,時間複雜度O(nlogn),注意l可能解出等於0的情況,這時應加一個LCM調整;


35.CF266E

將公式二項式展開之後用6個線段樹分別維護即可,修改可以預處理前綴和來完成,時間複雜度O(6nlogn);


36.CF332E

考慮枚舉那個01串中有多少1,這樣就確定了s串中每隔幾個字符是受一個1控制的,然後貪心;

從後往前枚舉01串,如果這一位填1可以就填1,否則填0,之後更新答案的最小字典序;

好神的做法啊。。。時間複雜度大概是O(k^2*|s|*logk)吧。。然而跑的飛快哦。。


37.CF273E

首先轉化博弈模型,因爲實際上勝負只與線段長度有關,所以可以定義SG(x)爲長度爲x線段的SG函數值,有轉移SG(x)=mex(SG(x/3),SG(x-x/3));

因爲x很大,我們不能直接推導,但是發現它的值域只有{0,1,2},並且打表後發現相同的SG值連成了一大段(在10^9內只有100多段),那麼考慮對於每一段處理就可以了;

利用SG函數預處理cnt[x]爲SG值爲x的線段個數,然後就是一個DP,f[i][j]表示前i個線段異或和爲j的方案數,答案就是f[n][1]+f[n][2]+f[n][3];


38.CF333C

構造題,考慮枚舉左面的四個數,然後搜索用加減乘能組成什麼數,再用右面的四個來湊;

注意可能有多種方案湊出同一個數,不要重複了,因爲方案實際上很多,所以不必搜全所有的方案,隨便搞搞就能AC了;


39.CF240F

考慮一個區間最小字典序的迴文串,我們只需要知道區間內字符個數就能構造出來;

因爲字符集很小,所以可以用線段樹維護區間某字符的個數,然後一個迴文串就能轉化成兩段單調區間來處理了;

時間複雜度O(nlogn*26);


40.CF305E

考慮轉化一下這個遊戲,我們將左右字符相同的點視爲黑點,對於每個黑點的連通塊是一個完全獨立的遊戲;

那麼每次操作就變成了選擇一個黑點,將它和左右三個點染白,這樣就得到了SG函數的O(n^2)遞推式;

求出SG函數之後將所有遊戲加起來就能得到是否勝利了,枚舉第一步的走法然後驗證也是O(n^2)的;


41.CF235D

考慮樹上兩個點對答案的貢獻,如果一個點被分治時另一個點計入了答案,那麼這個概率相當於是這兩個點路徑上所有的點都沒有被選中,概率爲1/dis,因爲這樣會對Totalval作出1的貢獻所以期望也爲1/dis;

轉化的到基環樹上也是一樣的,只是概率要用一個容斥,1/dis1+1/dis2+1/dis1和dis2總點數就可以了;


42.CF301C

詭異的一道題。。。考慮一種對所有數字都通用的算法;

一圖流:



43.CF309D

論CF的量子計算機與CCF老爺機的差距;

O(n^2)卡常數,枚舉兩個點,利用單調性得到另一個點的取值範圍;

注意判斷鈍角時用浮點會TLE,要利用餘弦定理直接整型來判斷;


44.CF325C

對於最小的可能,考慮每一個不會產出新怪獸的怪獸,利用鑽石數的單調性來跑dij轉移,轉移不到的即是-1;

那麼我們已經知道哪些是停不下來的了,對於最大的答案,就直接記憶化搜索,如果不是-1並且出現了環的話,那就是-2了;


45.CF316D3

這顯然是一個置換計數問題,考慮其中的一個循環,其中只能有兩個扔一次的人存在;

考慮一次的人,我們先求出有cnt1個一次的人的分組方案數,遞推爲g[i]=g[i-1]+(i-1)*g[i-2],要麼自己一組,要麼和(i-1)個人中的一個一組;

考慮加入一個兩次的人,他可能和一次的人一組,或者和之前兩次的人或者自己一組,那麼插入第i個人給答案乘(cnt1+i)就可以了;


棄療*2

CF317E這個構造。。

先判掉無解,然後就是一直向影子的最短路走,然後可以發現最終一定能走到無界區域或者重合;

既然走到了無界區域然後繞圈搞一搞就能將兩個人蹭到一起了;

說着容易然而調了兩天調不出來就棄療吧先= =。。


CF280E

邊界有點蛋疼了。。。理解了一下然後寫了一發調不出來啊。。

這個證明凸函數的思路確實很有意思嘛。。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章