USACO比賽題泛刷

隨時可能棄坑。
由於不知道最近要刷啥因此就決定刷下usaco。
優先級排在學習新算法和打比賽以後。
僅有一句話題解。難一點的可能有代碼。
優先級是Gold>Silver。Platinum刷不動...(可能有一兩道?)html

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分治的。但是我還沒學...redis

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...spa

2016 Dec Gold

LuoguP3036 [USACO16DEC]Lasers and Mirrors激光和鏡子

搜索。挺好想的,就是很差寫...
仔細研究一下題目,就能夠發現幾個性質:最優狀況下,每一個點確定只會被訪問一次,每條邊(指網格)也僅會被訪問一次。
因此這樣子寫個bfs的話是\(O(n)\)的。
實現方式有不少種...,維護3個vis數組,表示這一行/列有沒有訪問過,以及這個點有沒有被訪問過。
由於座標有點大,而後能夠發現的是隻要是相同行的就能走到,因此能夠先離散一波。
而後建兩個圖,對於每一個點,從橫座標向縱座標連邊(另一個圖反着),邊權均爲1。
而後從起點開始bfs,對於每一個點,拓展沒有走過的點(這個點的橫/縱座標之一也必須是沒走過的。)
分類討論轉移便可。細節好多...反正我是重構了3,4次...指針

LuoguP2847 [USACO16DEC]Moocast(gold)奶牛廣播-金

同poj2349,改改就行了,跑一遍mst取個最大邊權平方便可。htm

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\)
而後按第一關鍵字左端點升序排序,第二關鍵字右端點降序排序求解便可。若是右端點大於以前的全部右端點就累加進答案。
至於爲何我以爲有個題解講的挺好的。

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

http://www.javashuo.com/article/p-eeemunke-r.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多行...

相關文章
相關標籤/搜索