快要noip了,其实本来就觉得冲省选没啥希望,干脆先刷刷水题啦啦啦。
其实也不是每一个都是一眼题,一次A还是有难度的。大概一次A的不到六成。orz.
今天目前刷了11道题,有以前堆下来的难题,仅仅记录水题部分。
1600: [Usaco2008 Oct]建造栅栏
不难发现a,b,c,d中的任何一个都应小于n/2,即可满足条件。
那么我们只要给这个有限背包加一个转移限制,即每次往前找最多n/2个合法状态进行更新。
f[i][j]=Sigma(f[i-1][j-k])(k∈min(n/2,j))
1601: [Usaco2008 Oct]灌水
对于每一个水田只有两种选择,要么和另一个水田连为一块,要么和水库相连。不难想象最终结果会是一个包含水库的完整连通块(即包含所有水田和水库)
那就是最小生成树问题咯,将水库当做一个水田放进去然后做一遍Kruskal就过了
1602: [Usaco2008 Oct]牧场行走
树的结构,求两点距离。一个裸的LCA贴在脸上。
倍增法秒之。
1603: [Usaco2008 Oct]打谷机
一个树结构,简单的dfs将旋转方向递归搜索出来即可
1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
这题还是比较巧妙的。本来是想要反转坐标系用树状数组乱搞,还是orz了。
d=|xi-xj|+|yi-yj|不好搞啊,两个绝对值!怎么办?
经过一系列分类讨论我们发现:d=max(|xi-yi|-|xj-yj|,|xi+yi|-|xj-yj|)
于是我们用x=x0+y0,y=x0-y0代替原来的坐标
以x为第一关键字排序,维护一个单调队列使得当前队列中所有元素的x差比c小
并且我们发现其实只要把每个点最近的一两个点建立“群”关系,就可以得到所有边
所以我们用一个multiset维护y值,用STL的二分查找寻找到最近的两个点建立关系
答案用并查集在过程中进行计算即可。
1606: [Usaco2008 Dec]Hay For Sale 购买干草
裸到家里的01背包,不做解释
1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
用类似筛法的做法暴力统计即可
1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
做一遍最长上升子序列再做一遍最长下降子序列,用总长度减去最长序列长度,两者取较优答案。
1610: [Usaco2008 Feb]Line连线游戏
O(n^2)枚举所有点可以构成直线的斜率,注意特判和精度,去重即可得到答案。
1611: [Usaco2008 Feb]Meteor Shower流星雨
题目本身不难,只是刚开始想歪了想成动归了。后来意识到其实bfs就可以了。
对于每一个状态判断该状态会不会踩进被流星砸中的地区,直到拓展至永久安全点为止。
1612: [Usaco2008 Jan]Cow Contest奶牛的比赛
刚看一分钟在想会不会是查分约束,不过很快比较顺利的想出算法,虽然推导过程算不上清晰。
dfs两次分别寻找每一头奶牛可确定的比自己大的奶牛和比自己小的奶牛的数目,如果自己与其他奶牛的相对大小全部确定即可确定排名
1613: [Usaco2007 Jan]Running贝茜的晨练计划
本应该是道比较水的动归,却被我想了将近半小时。
f[i][j]表示第i分钟疲劳度为j最多能跑的路程
那么f[i][j]=f[i-1][j-1]+d[i]
f[i][0]=max{f[i-j][j]}
注意f[i][0]=max(f[i-1][0])这步特殊转移
今天暂时先写这么多了,等真正停课在开始专心刷题。