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 的边跑最大生成树即可

然后某计算几何被我跳掉了,没什么地方会考==
果然贴吧说这场比较难真的出现了很多好题。

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