USACO比賽題泛刷


隨時可能棄坑。
因為不知道最近要刷啥所以就決定刷下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)\)轉移了。
然后需要一點計數套路...考慮那些需要押韻的行數對答案貢獻。

\[ans=\sum{f[K][j]^{cnt[i]}}$$($cnt[i]$為需要壓這種韻的行數) 其實就是必須放一樣的,那么就用排列算一下就可以知道是這個東西(但是沒規定要放哪種,所以取個$\sum$)。 乘法原理把每個ans乘起來就好。 (我感覺這個T1其實是三題里面最難的..?) ### LuoguP5200 [USACO19JAN]Sleepy Cow Sorting > 想出來一個結論的話就可以挺順理成章地把后面想出來了。 **每頭牛最多被移動一次**。 其實也挺顯然的,因為每次只能移動隊頭。 考慮什么牛不會被移動,其實就是最后面那段遞增序列不用移動。從后往前數第一個不遞增的數,1~它全都得移動(因為要把前面的移動了才能移動它)。 而又由上面那個結論可以知道,我們可以在移動的過程中順便維護出它應該在的位置。這個可以用bit解決。 首先對於每個$j(1\leq i \leq x)$(x為從后往前數第一個不遞增的數),它至少要往后$x-i$頭牛(這樣才能把x扔到前面),然后考慮把它插入到后面那個遞增序列的合適位置,即比它小的數有多少個(這個東西用bit可以很方便的維護)。 那這樣的效率就是$O(nlogn)$的了。 ### LuoguP5201 [USACO19JAN]Shortcut > 因為完全忘記了有最短路樹這種東西,對這題一臉懵逼,所以看了一下題解之后趕緊滾回去看了czl的課件... 先跑一遍Dijkstra。 因為題目要求字典序最小,那么枚舉起點從小的開始枚舉,如果枚舉到的這條邊的兩個端點都沒連過,那么就可以扔進最短路樹里面(因為枚舉順序,如果連過肯定是被更小點連過了,那么字典序會更小)。 然后思路就很顯然了。因為是一棵樹,加了一條非樹邊之后顯然子樹里面都可以不走中間那段了,維護子樹的奶牛數量,答案即為: $ans=max\{siz[u]*(edge-T)\}$ ## 2019 Jan Silver ### LuoguP5199 [USACO19JAN]Mountain View > 偏思維一點的題。 考慮到是等腰直角三角形,所以下面的左端點就是$x-y$,右端點就是$x+y$。 然后按第一關鍵字左端點升序排序,第二關鍵字右端點降序排序求解即可。如果右端點大於之前的所有右端點就累加進答案。 ~~至於為什么我覺得有個題解講的挺好的。~~ ![](https://img2018.cnblogs.com/blog/1113423/201904/1113423-20190401221205973-1881027141.png) ### LuoguP5198 [USACO19JAN]Icy Perimeter > 簡單爆搜。將聯通塊划分出來,那么面積就是最大聯通塊,然后對每個最大聯通塊取個周長min就好了。 ### LuoguP5197 [USACO19JAN]Grass Planting > 顯然答案是max(度數+1) ## 2017 Dec Gold ### BZOJ5140: [Usaco2017 Dec]A Pie for a Pie > 最短路+set。 這個顯然是個最短路問題...,把每個A中B值為0的作為起點往回跑,B中A值為0的作為起點往回跑。每個$a_i$的答案即為它的dis值。 發現邊權只有1,所以bfs處理即可。還有一個問題是,邊數最大可以到$n^2$,於是我就不會做了。去看了題解的神仙操作:用兩個set來維護。 (盡管數據很水,強行連邊也跑的飛快。當然這是后面才知道的不然也不會寫set做法了...) 首先將每個可能的終點塞進去隊列里面,不可能作為終點的就塞進對應的set里面。 每次在set里面二分出來所有可以走的點松弛,松弛完直接刪掉(bfs的最優性。)。 所以答案1~n的dis。無解情況將dis初值賦值為-1即可。 這樣復雜度是$O(nlogn)$的。 這套其他兩題以前做過了。 ## 2018 Feb Gold ### BZOJ5195: [Usaco2018 Feb]Directory Traversal > 換根dp。 一開始看到這題差點以為是大模擬然后直接跑路了。 現在仔細研究了一下其實就是個板子題。 雖然這題題意也有點奇怪就是了:給一棵樹,邊權是子節點的字符串的長度+1(對於葉子結點的父親,沒有+1) 然后求以某個點為根的每個葉子結點的路徑最小和(根自己選)。 那顯然就是個換根dp了。 先一次dfs求出以1為根的情況。 然后轉移有點特殊: $$f[son]=f[fa]-(siz[son]*(len[son]+1))+(tot_{leaf}-siz[son])*3\]

考慮這個式子的意義:以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。
那么分類今天有沒有出走轉移即可。

\[f[i][j][k] = min\{f[i-1][j][k-1] + (a[i] != k)\}(今天沒出走)\\ f[i][j][0] = min\{f[i-1][j-1][k] + (a[i] != 0)\}(今天出走了) \]

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個一樣的。
用經典的容斥式子:

\[ans=\sum_{i=1}^5f(i)*(-1)^i \]

\(f(i)\)為一樣的對數的個數。
那么\(2^5\)枚舉所有取法,容斥一遍即可。
用bitset優化一下暴力也跑的飛快,就慢了幾百ms。復雜度是小常數的\(O(\frac{n^2logn}{w})\)(要開map不然存不下,或者可以分塊求答案就不用開map)。
代碼的話戳這里

2017Open Gold

BZOJ4779 [Usaco2017 Open]Bovine Genomics

https://www.cnblogs.com/henry-1202/p/10631415.html

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多行...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM