USACO 2015 February CONTEST,Silver&Gold Division Solution

由於這套題某兩題重複了3次,我就只好放在一起寫了

Cow Hopscotch

這道題Bronze,Silver,Gold各有一道,難度依次增加。

對於Bronze的,顏色只有兩種,r和c<=15,O(n^4) 跑一發dp即可(比noiopenjudge的dp還簡單==)

對於Silver的,顏色有10000種,r和c<=100,我們可以對於狀態(x,y,c),我們可以記錄\sum_{i<x,j<y} dp[i][j] ,然後用這個減掉\sum_{i<x,j<y,c[i][j]=c[x][y]} dp[i][j] ,就可以更新dp值了。但是由於這樣不好前綴和,我們直接整列整列地前綴和,記錄一個sum[i][j] ,表示掃描到當前第i列顏色爲j的dp總和,再記錄一個cnt[i],掃描到當前第i列的dp值總和。對於(x,y,c),我們有:

dp[x][y]=\sum_{i<x} cnt[i] - \sum_{i<x} sum[i][c]
因爲巧妙安排了掃描順序,所以可以省掉y那一維(其實就是前面一個for(1:n),裏面一個for(1:m),沒什麼巧妙的==)
那麼O(n) 地轉移。時間複雜度O(n^3) ,空間複雜度O(n*k)
對於Gold的,顏色750^2 種,r和c<=750,不得不直面上面的那個問題。我們可以用分治來優化dp
我們整行整行地掃描(1~m),然後豎着分治(1~n)。
引入bit的思想,強制第i行從i-1的二進制有1的地方轉移(好像不太好表達),舉個例子,第7行的從1~4行引入狀態,再從5~6行引入狀態。第6行從1~4行引入狀態,再從第5行引入狀態。
這樣的好處是分治掉的那一維是已經分裝好了的,不用考慮順序問題。
設當前的區間爲[l,r],我們先得到[l,mid]的狀態,然後對於[mid+1,r]的那些行:
dp[x][y]=\sum_{l<=i<=mid,1<=j<y} dp[i][j]- \sum_{l<=i<=mid,1<=j<y, c[i][j]=c[x][y]} dp[i][j]
然後我們巧妙地安排掃描順序即可完成。
時間複雜度O(nlogn*m) ,空間複雜度O(k+n*m)

Censors

同樣的,這道題Bronze,Silver,Gold各有一道,難度依次增加。
這是道字符串hash(AC自動機)題(然而並不會AC自動機就只好笨笨的hash)
Bronze的那道S.length<=1e6,T.length<=100,我們可以暴力匹配,然後刪除。注意了,匹配可以用STL:string.substr(start,end),刪除可以用STL:string.resize(remainlength),一開始我笨笨地敲了一個鏈表來刪除而且還WA了==
Silver的hash匹配,大家都會的。刪除同上
Gold的依舊hash匹配,好像除了要for n遍沒區別吧。。刪除同上。

Superbull

發現比賽只會進行n-1場,聯想到樹的性質,發現這可以建成最大生成樹的模型。
每兩個點之間連一條邊權爲vi~ XOR ~vj 的邊跑最大生成樹即可

然後某計算幾何被我跳掉了,沒什麼地方會考==
果然貼吧說這場比較難真的出現了很多好題。

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