隨時可能棄坑。
因為不知道最近要刷啥所以就決定刷下usaco。
優先級排在學習新算法和打比賽之后。
僅有一句話題解。難一點的可能有代碼。
優先級是Gold>Silver。Platinum刷不動...(可能有一兩道?)
2015 Feb Gold
BZOJ3939. [Usaco2015 Feb]Cow Hopscotch
這題洛谷數據過水,\(O(n^4)\)的dp跑的飛快。。。所以建議在bzoj寫。
但是還是要考慮一下4次方的dp的...其實就是強行枚舉轉移點,我們可以試着維護前綴和,那么只要倒序枚舉m,即有\(f[i][j]=sum[i-1][j-1]\)了。
但是注意到\(sum[i-1][j-1]\)包含了不能轉移的情況,發現相同情況最多\(750*750\)種,所以可以拿\(750*750\)個線段樹動態開點維護一下就完事了。
兩者相減即為答案,注意第二層要倒序枚舉。
當然也是可以cdq分治的。可是我還沒學...
2017 Jan Platinum
BZOJ4756. [Usaco2017 Jan]Promotion Counting
想了幾種做法...
主席樹\(O(nlogn)\),線段樹合並\(O(nlogn)\),分塊\(O(n\sqrt{n}log(\sqrt{n}))\),然而都懶得寫...
然后就寫了一個莫隊+BIT。\(O(nsqrt{n}logn)\)。離散化一下就行了...
就是把dfs序爬下來,順便記錄一下siz,那么一個節點的子樹在dfs上就是\([dfn_x,dfn_x+siz_x-1]\),那就用莫隊維護一下,每次移動指針對應的在bit里面操作就好了...
然而在樹上直接BIT求逆序對真的沒看題解之前不會寫(把之前答案刪了處理完子樹再加上去,這個真的沒想到)。
2016 Open Gold
LuoguP3145 [USACO16OPEN]分割田地Splitting the Field
簡單套路題...按x值排序之后,枚舉分割點求個min就好了,維護y軸坐標的區間max和min,這題可以直接\(O(n)\)處理出來,不過我寫了個ST表...
然后再按y軸排序再來一遍。但是這個完全重合有點奇怪...我把判斷刪掉才過了...也可能是我判斷寫錯了吧...
復雜度是\(O(nlogn)\)的。
BZOJ4579. [Usaco2016 Open]Closing the Farm
並查集。
還是挺套路的吧...就是把刪邊變成連邊就好了。
然后考慮怎么判斷。對每個集合維護一個siz,每次合並的時候順便把siz並起來。
然后每次把相鄰節點merge起來(要判斷那個相鄰節點是不是還沒連上去)。然后再遍歷一次,如果有一個的siz不等於當前總節點數,顯然就不連通。
這樣復雜度是\(O(nlogn)\)的(只用路徑壓縮)
LuoguP3146 [USACO16OPEN]248
寫了一個不同於其他題解的dp。
\(f[l,r,k]\)表示區間\([l,r]\)合並出\(k\)是否可行。
注意到直接枚舉轉移的話是\(O(n^4)\)的。考慮優化一下。
因為這樣子的dp值是只有0和1的,所以可以拿一個bitset優化一下,就是&一下左右兩個子區間然后右移一位就行了。
至於答案可能不需要把整段並起來這個問題,再開一個bitset,每次對得到的區間或以下就好了。
這樣就能\(O(\frac{n^4}{w})\)搞過去了。
2017 Jan Gold
LuoguP3608 [USACO17JAN]Balanced Photo平衡的照片
很顯然的一道題了...離散一下之后用值域BIT維護一下就行了...復雜度是\(O(nlogn)\)
LuoguP3609 [USACO17JAN]Hoof, Paper, Scissor蹄子剪刀…
簡單dp.設\(f[i,j,k]\)表示前i局,換了j次手勢,現在是出第k種手勢(0-石頭 1-剪刀 2-布)
然后寫個check函數應付一下不換手勢的做法就好了。
分成這輪換手勢,這輪不換手勢兩種轉移。(換手勢肯定是要換贏的)。
怎么usaco這么喜歡出dp...
2016 Dec Gold
LuoguP3036 [USACO16DEC]Lasers and Mirrors激光和鏡子
搜索。挺好想的,就是不好寫...
仔細研究一下題目,就可以發現幾個性質:最優情況下,每個點肯定只會被訪問一次,每條邊(指網格)也僅會被訪問一次。
所以這樣子寫個bfs的話是\(O(n)\)的。
實現方式有很多種...,維護3個vis數組,表示這一行/列有沒有訪問過,以及這個點有沒有被訪問過。
因為坐標有點大,然后可以發現的是只要是相同行的就能走到,所以可以先離散一波。
然后建兩個圖,對於每個點,從橫坐標向縱坐標連邊(另外一個圖反着),邊權均為1。
然后從起點開始bfs,對於每個點,拓展沒有走過的點(這個點的橫/縱坐標之一也必須是沒走過的。)
分類討論轉移即可。細節好多...反正我是重構了3,4次...
LuoguP2847 [USACO16DEC]Moocast(gold)奶牛廣播-金
同poj2349,改改就好了,跑一遍mst取個最大邊權平方即可。
LuoguP2848 [USACO16DEC]Cow Checklist奶牛確認單
簡單dp。設\(f[i][j][0/1]\)表示目前訪問了i頭H牛,j頭G牛,現在在H牛/G牛處。因為只能順序訪問,所以轉移是\(O(nm)\)的,分類討論一下即可。
答案是\(f[n][m][0]\)。注意初始化為\(f[1][0][0]=0\)
2019 Jan Platinum
LuoguP5202 [USACO19JAN]Redistricting
將\(H\)設為1,\(G\)設為-1,維護一個前綴和。
顯而易見的可以設一個\(O(nk)\)的方程:\(f[i] = min\{f[i-j]+[s[i]-s[i-j]<=0]\}(i-j\leq k)\)
考慮優化,用個單調隊列或者優先隊列其實都可以維護。
單調隊列復雜度更優但是難寫所以因為太懶我就寫了優先隊列優化。
對堆中每個點儲存兩個值,dp值和位置。
按dp值升序排序,dp值相同按s[i]升序排序。(因為要求min,把那個式子移項一下就可以知道為什么要按s[i]升序了)。
每次轉移時先把距離大於k的點都彈掉(單調性),然后取堆頂(但是不彈出)轉移。
這樣就可以\(O(nlogk)\)轉移了。
2019 Jan Gold
LuoguP5196 [USACO19JAN]Cow Poetry
需要一點思維
(套路)的計數dp以及閱讀理解能力。
反正我是看了很久的題才看懂題意...
考慮\(f[k][j]\)表示一個長度為k的句子以韻部j結尾。
顯然有轉移方程$$f[k][c[i]]=\sum{f[k-s[i]][j]}$$
優化一下就是設$$g[k]=\sum{f[k][i]}$$
然后就可以\(f[k][c[i]]=\sum{g[k-s[i]]}\)愉快的\(O(nk)\)轉移了。
然后需要一點計數套路...考慮那些需要押韻的行數對答案貢獻。
考慮這個式子的意義:以son節點為根,那對於以son的父親為根來說,肯定就少了到父親那一段的引用距離。所以減掉,然后以son為根,那么除了son子樹內的葉子結點,其他的葉子結點的路徑肯定多了一段:"../",所以*3.(siz指該子樹內葉子結點的數量)。
復雜度\(O(n)\)
BZOJ5196: [Usaco2018 Feb]Taming the Herd
dp。一開始沒想到能dp...搜了題解看到dp兩字滾回去思考了一發差不多就想出來了。
因為n<=100所以考慮一個\(O(n^3)\)的dp。
設\(f[i,j,k]\)表示前i頭牛 出走了j次 當日的真實天數為k。
那么分類今天有沒有出走轉移即可。
2018Dec Gold
BZOJ5488: [Usaco2018 Dec]Teamwork
簡單dp。一開始看錯題意了...以為分成k組,每組不超過k,然后寫了個\(O(nk)\)的單調隊列優化dp...
實際上組數沒限制...
所以可以設\(f[i]\)表示到i的最大價值和。用刷表法轉移。
\(f[j]=max(f[j],f[i-1]+(j-i+1)*mx)(r-l+1<=k)\)
mx為區間\([i,j]\)的最大值。
復雜度是\(O(nk)\)的。
BZOJ5486: [Usaco2018 Dec]Fine Dining
分層圖啥都能干.jpg
考慮設\(d[i][0]\)表示從n開始走到i的最短路,\(d[i][1]\)表示從n開始走到i經過一個草堆的最短路。
那么Dijkstra跑一發分層圖就好了。也沒啥細節。注意分層圖分類別分少了就好。
BZOJ5487: [Usaco2018 Dec]Cowpatibility
正解是容斥(然而我並不會,只會bitset優化暴力,去找題解學習了一下容斥做法)。
不過bzoj好像調了時限,然后我現在網上找到的所有容斥題解都TLE了(因為網上的題解都用了string,換成hash才能過)。
容斥做法:
顯然轉化為\(n(n-1)/2-\)和諧對數。
然后和諧對數就5種情況:1個一樣的,2個一樣的,3個一樣的,4個一樣的,5個一樣的。
用經典的容斥式子:
\(f(i)\)為一樣的對數的個數。
那么\(2^5\)枚舉所有取法,容斥一遍即可。
用bitset優化一下暴力也跑的飛快,就慢了幾百ms。復雜度是小常數的\(O(\frac{n^2logn}{w})\)(要開map不然存不下,或者可以分塊求答案就不用開map)。
代碼的話戳這里
2017Open Gold
BZOJ4779 [Usaco2017 Open]Bovine Genomics
BZOJ4780 [Usaco2017 Open]Modern Art 2
這題看了題解...
考慮什么情況會是無解?顯然就是兩條線段不包含而又相交。
用棧來維護。每次遇到一個新的顏色(這種顏色第一次出現)就入棧。如果到了最后一次出現的地方就彈出。
那么如果中間有一次遇到一個top和當前顏色不同的,肯定就無解了(如果是包含的,它就會入棧了,沒入棧說明一定是相交且不包含。)。
答案就是top的最大值。(因為每次塗色區域不能相交)
注意0是不塗色。所以不用管它。
2017Open Silver
BZOJ4781 [Usaco2017 Open]Paired Up
模擬。兩個指針掃一掃即可。
BZOJ4782 [Usaco2017 Open]Bovine Genomics
枚舉三元組。用個桶判三元組在A出現過沒有即可。一開始看錯題意了...
BZOJ4783 [Usaco2017 Open]Where
爆搜。調了1h多調到心態有點炸...
\(O(n^4)\)枚舉矩形。dfs判定。可以先不管覆蓋條件,把所有符合條件的矩形找出來,最后\(O(n^2)\)去個重。
大概80多行...