UPD:我真不是想骗访问量TAT。。一开始没注意总长度写着写着网页崩了王仓(其实中午的时候就时常开始卡了= =)。。。。损失了2h(幸好长一点的都单独开了一篇)。。。。吓得赶紧分成两坨。。。。TAT。。。。。。。。。。。。。。
——————————————————————————————————————————————————————————————————————————————
写(被虐)了整整一个月b站上usaco的金组题。。。然而到现在总共只写了100道上下TAT(当然是按AC人数降序排列的了)(另外,是用云神的号写的= =毕竟三百大洋)
大概不到1\3是自己写的,一半是有大概方向后跑去看题解,剩下的就是毫无思路就去看题解作死的了= =
感觉金组题还是比较适合自己当前水平的QAQ。。。所以大致的写下题解加深下印象吧。。。对于比较经典而自己又不熟的题打算专门另写题解(瞬间就挖了一个大坑)
这里贴出50道。。。
bzoj 1597:[Usaco2008 Mar]土地购买
斜率优化入门题。f[i]表示买前i块土地的最小费用
f[i]=min{
f[j]+max_w(j+1,i)*max_l(j+1,i),( 0<=j<i )
}// max_w(j+1,i)和max_l(j+1,i)分别表示第j+1块土地到第i块土地中宽度和长度的最大值
首先去掉那些被别的土地完全覆盖的土地(因为不会对答案有任何影响),剩下的按宽度排序。宽度升序排序的话,长度一定是降序的(被完全覆盖的都被去掉了)
方程就变成 f[i]=min{ f[j]+wid[i]*len[j+1] },(0<=j<i)
剩下的就是斜率优化了。。。
bzoj 1699:[Usaco2007 Jan]Balanced Lineup排队
rmq裸题。。。因为不涉及区间修改的操作所以可以用线段树的点树写法(建成一个堆)来写。。。
bzoj 1230:[Usaco2008 Nov]lites 开关灯
线段树区间修改。。。
bzoj 1666:[Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏
代码长度知一切系列。。直接模拟即可
bzoj 1724:[Usaco2006 Nov]Fence Repair 切割木板
反过来看就是合并果子。。维护小根堆,每次把最短的两段木板并起来,直到变成一段
bzoj 1726:[Usaco2006 Nov]Roadblocks第二短路
求严格次短路。。。最短路改一下。。同时记录到达某个点的最短距离和严格次短距离
为了压常数把本来的代码长度改长了不少(反正本来也就毫无可读性= =)。。
bzoj 1231:[Usaco2008 Nov]mixup2 混乱的奶牛
题目是要求能使排列混乱的方案数。语死早。。数据范围显然状压。。
f[i][j]表示当前已选入列奶牛的状态为i,最后一头牛编号为j的混乱方案数,(0<i<2^n,1<=j<=n)
f[0][0]=1;f[i][j]=sum{f[i-2^j][k]},(S[k]-S[j]的绝对值>K,j存在于状态i中)
bzoj 1572: [Usaco2009 Open]工作安排Job
按截止时间降序排序。也就是时间从大到小枚举,每个时间点安排价值最大、且截止时间在当前时间点之前的工作
具体实现就不能一个一个时间点枚举了。。在相邻工作的截止时间之间的时间点,可以完成的工作都是不变的
单调队列优化一下。
bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级
分层图最短路。。。dis[i][j]表示到i点,共更新了j条边的最短路径长度。
按照更新的边数建K+1层图,第i层表示当前更新了(i-1)条边。除了在本层内扩展外,第1~K层的点还可以向更高的一层扩展(更新当前边为0)
bzoj 1708: [Usaco2007 Oct]Money奶牛的硬币
完全背包。。。一开始竟然没看出来王仓
bzoj 1690: [Usaco2007 Dec]奶牛的旅行
01分数规划。。。二分答案为mid,将原图的边(u,v,time)重建为(u,v,fun[v]-time*mid),如果新图中有负环那么当前答案可行
bzoj 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式
字符串http://www.cnblogs.com/czllgzmzl/p/4989723.html
bzoj 1692: [Usaco2007 Dec]队列变换
贪心。。。当前剩下的队伍为[l,r],每次比较 l到r 这段字符串和 r到l 这段字符串,哪段小选哪段
比较字符串大小的时候可以用hash+二分求出最长公共前缀的长度,再比较下一位的大小
hash用unsigned int不会被卡。。。感人。。明显优势#1
然而O(n^2)暴力可过TAT
bzoj 1782: [Usaco2010 Feb]slowdown 慢慢游
dfs序,一头牛走到点i,相当于将点i所在子树的权值都+1,查询的时候查询牛要走到的点的权值
也可以差分,变成点修改+区间查询,用树状数组就行了。。。
太傻逼用线段树然后被常数感动哭了
bzoj 1827: [Usaco2010 Mar]gather 奶牛大集会
O(n^2)的暴力就是对每个点都把整棵树遍历一遍
考虑一下,假设求出了到当前点i的不方便值为fasum,如何快速计算i的儿子的不方便值
先预处理出每个点的子树内奶牛总数存在size[],那么对于i的某个儿子j,所有不在j的子树里的奶牛都得多走从i->j这段路,而j子树里的奶牛都可以少走i->j这段路
nowsum=fasum+(cownum-size[j])*dis(i,j)-size[j]*dis(i,j);
bzoj 1592: [Usaco2008 Feb]Making the Grade 路面修整
显然(看题解才知道的TAT)一段路修整后,高度一定和原来那些路中的某一段相等。。。。所以把高度离散化一下就变成O(n^2)的dp了。。。
不下降的情况:f[i][j]表示前i段路,第i段高度修整为j的最小支出
f[i][j]=min{ f[i-1][k]+abs(h[i]-h[j]) },(k<=j)转移的过程中顺便记录一下k就行了
不上升就倒过来做一遍
bzoj 1725:[Usaco2006 Nov]Corn Fields牧场的安排
数据范围就是状压了。。
f[i][j]表示前i行,第i行种草状态为j的总方案数。
f[i][j]=sum{ f[i-1][k] },j状态和k状态是合法的(没种到那一行贫瘠的土地,且没有草相邻),且j&k==0(没有上下两行没有草在同一列)
预处理了各种非法情况结果比直接枚举慢= =
bzoj 1711:[Usaco2007 Open]Dingin吃饭
二分图最大匹配。。s连奶牛,饮料和食品连t,每头牛往它要吃的东西连边。。。用dinic比匈牙利算法慢了点
bzoj 1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富
裸dp。f[i][j]表示走到第i列,第j行最大财富,
f[1][1]=map[1][j];f[i][j]=max{f[i-1][j-1],f[i-1][j],f[i-1][j+1]}
注意边界。。。。第0、n+1行和第1列初始化成负无穷QAQ
bzoj 1571: [Usaco2009 Open]滑雪课Ski
dp,f[i][j]表示前i时间过后,能力值为j的最大滑雪次数
f[i][j]=max{
f[i-1][j],//开颓
f[ i-Dmin[j] ][ j ]+1,//先把斜坡按所需能力排序,Dmin[j]表示 所需能力值<=j的斜坡中 所需最小时长
g[ i-L[k] ],//上第k节课(前提是有课= =),g[i]表示f[i][1..100]中的最大值
}
代码丑得不忍直视。。。
bzoj 1715: [Usaco2006 Dec]Wormholes 虫洞
询问图中有没有负环。。。(回到过去必须是回到起点并且时间比出发时还早)
dfs版的spfa判负环。。
bzoj 1596: [Usaco2008 Jan]电话网络
树形dp。。http://www.cnblogs.com/czllgzmzl/p/5064626.html
bzoj 2442: [Usaco2011 Open]修剪草坪
单调队列。。
最大效率==总效率-最小损失效率。f[i]表示前i头奶牛,因为不能有连续K只奶牛而损失的效率的最小值(第i头牛不安排)。
f[i]=min{ f[j] } +E[i],(i-j<=K)
bzoj 1233: [Usaco2009Open]干草堆tower
斜率优化。。。
看了别人(似乎是wshjzaa?)题解才明白TAT http://www.cnblogs.com/sagitta/p/4650681.html
注:题解最后似乎有个地方<和>打反了?(或者是我语文不好。。)
bzoj 1707: [Usaco2007 Nov]tanning分配防晒霜
贪心。。http://www.cnblogs.com/czllgzmzl/p/5064620.html
bzoj 1709: [Usaco2007 Oct]Super Paintball超级弹珠
难得的傻逼题。。可以O(n^3)无脑暴力。。。
或者是先预处理一下,读入时处理出 每一行、每一列、每一条对角线的对手数量。。。当然还有每一个点上的对手数
某个射击位置(x,y)能打到的对手数就是 第x行的对手数+第y行的对手数+所在两条对角线的对手数-3*((x,y)这个点上的对手数)
bzoj 1576: [Usaco2009 Jan]安全路经Travel
并查集正确姿势。。http://www.cnblogs.com/czllgzmzl/p/5064758.html
bzoj 1593: [Usaco2008 Feb]Hotel 旅馆
比较正常的线段树题目。。。维护一段只有0和1的区间里面,最长的0的长度,从左边开始、从右边开始的最长的0的长度
每次查找区间位置的时候,如果左子树里的够长就去左子树找,不然试试跨过左右子树的那段,最后才去右子树里找。(无解直接输出0)
区间修改的话就维护一个标记,表示当前区间被覆盖的情况(客人订满、客人退空、已下传)
1A感人TAT
bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序
置换群。。现在还是不会置换群QAQ。。。不过至少这题的题解看得懂QAQ。。。
题解网上一坨。。因为poj里也有= =
bzoj 1828: [Usaco2010 Mar]balloc 农场分配
把各个请求按右端点从小到大排序。。然后直接依次能满足的就满足。。。这样就行了。。。。至于为什么这样子贪心是对的。。TAT
设区间左右端点为l[],r[]...
因为是按r排序的:如果当前区间插入后会影响到后面的某个区间的话,那么相比于那个被影响的区间,插入当前区间更优。
并且在插入当前区间前我们已经尽量满足了r更小的区间,所以当前区间对之前的区间无影响。
bzoj 1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果
就是求后继节点的总数。。。因为整张图是由若干个基环内向树组成,所以可以用tarjan缩点后做。。。
不过因为是基环内向树(同今年noipD1T2)。。从某个点开始一直走就会把它所连向的环走遍,也就起到了缩点的效果。。
具体就开个栈记录一下当前路径,记录一个点是否在栈中。注意已经求出后继节点数的点就不用再走了.
//之前弄了半天依然被踩在#2。。。。知道刚刚才想到一个布尔数组不用开才弄到200ms。。。再加了个输出优化瞬间就176ms了= =感人肺腑
//为什么我每次用register int都更慢
bzoj 1754: [Usaco2005 qua]Bull Math
高精度乘法。。。。。。。。。。。。。。出题人为了题目覆盖范围竟然如此。。。。。
bzoj 1770: [Usaco2009 Nov]lights 燈
高斯消元解异或方程组。。。。自由元就暴力枚举+最优性剪枝= =。。。
话说自由元啊什么的一直不懂。。。数学方面以后再慢慢补吧(已经无数次这么说了TAT
抄了黄学长代码。。捂脸
bzoj 1691: [Usaco2007 Dec]挑剔的美食家
有点像bzoj1828。。。都是两个限定条件,虽然具体有点不同= =
把奶牛按要求最低价升序排序,牧草按价格升序排序。
枚举牧草,每种牧草让可接受它的奶牛中,对新鲜度要求最高的奶牛吃。
具体就是用平衡树维护可接受当前价格的奶牛(会越来越多)的要求新鲜度。。每种牧草按新鲜度在树中找一下前驱。
手打treap比调stl的慢= =
bzoj 1753: [Usaco2005 qua]Who‘s in the Middle
如题。。。。。。。。。。。。。。。。
加了快速读入比没加的慢是什么情况= =
bzoj 1574: [Usaco2009 Jan]地震损坏Damage
就是说对于报告的每个点,都要找到一圈点把它围起来(与1点阻断)。。显然(又是看题解才知道的QAQ)这一圈点就是那个点相邻的所有点(当然相邻点也可能是被报告的点,但总之这些点都无法到达了)。。
因为圈内的点都无法到达,我们要使得圈上及圈内的点最少。。所以圈越小越好。。
把每个报告的点的相邻节点都设为不可通过,最后统计下还能到达的点的数目就好。
bzoj 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生
DPhttp://www.cnblogs.com/czllgzmzl/p/5066443.html
bzoj 1710: [Usaco2007 Open]Cheappal 廉价回文
因为最后要形成回文串。。。对于回文串来说删一个字母和 在对应位置添加一个同样的字母是等价的= =
所以把一个字母和谐掉的代价是min(删除该字母费用,添加该字母费用)。。(记为cost[])
接下来就是区间dp了。。。f[i][j]表示把原字符串中第i个~第j个字母变成回文串的最小代价。。原字符串为s
f[i][j]=min{
f[i][j-1]+cost[s[j]],f[i+1][j]+cost[s[i]],
f[i+1][j-1],(s[i]==s[j])
}最后答案就是f[1][m]
bzoj 1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名
善用stl。。。善调bitset。。。
按给出的大小关系建图。。求出每头牛i能确定的比它小的奶牛的数量num[i],答案就是 总对数-已知的关系对数。
为啥同样是调bitset我就慢了这么多TAT
bzoj 1578: [Usaco2009 Feb]Stock Market 股票市场
看了老司机的题解。。。http://www.cnblogs.com/JSZX11556/p/4664348.html
引用:“我们假设每天买完第二天就卖掉( 不卖出也可以看作是卖出后再买入 ), 这样就是变成了一个完全背包问题了, 股票价格为体积, 第二天的股票价格 - 今天股票价格为价值.... 然后就一天一天dp...”。
bzoj 1598: [Usaco2008 Mar]牛跑步
求第k短路。。看了kpm大爷的代码才知道可以懒出新境界。。。
用优先队列维护spfa的队列(其实就变成了堆优化的dij)。。一个点出队k次时我们就得出了k短路。。。。
bzoj 2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛
终于是傻逼题了。。。没有上司的舞会。树形dp,f[i][0]表示以i为根节点,i不选,能选的最多点数,f[i][1]表示以i为根节点,i选,能选的最多点数。
f[i][0]=sum{ max(f[j][0],f[j][1]) },(j是i的儿子);f[i][1]=sum{ f[j][0] },(j是i的儿子)
bzoj 1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列
和bzoj4236那题思路一样。。。求得各种颜色数的前缀和,并差分。。如果两不同位置上差分后的结果相等,就说明这两个位置之间各种颜色数量相等。
可以上hash。。。然而卡常无力被稳稳地踩了TAT
bzoj 1704: [Usaco2007 Mar]Face The Right Way 自动转身机
如果K已经确定的话,可以O(n)求出最小判断次数M:从前往后扫一遍,如果一个点i上奶牛朝后站着,就把i~i+k-1头奶牛都转过来。因为此时不转的话以后就转不了了。。。
注意无解的判定。。。如果第i头奶牛朝后站着且i+k>n(就是没有k头奶牛可以转了)就无解。。。
区间修改,单点查询。。。这个可以用差分。。因为只有朝前和朝后两种,就直接异或一下就好了。时间复杂度O(n*k)
bzoj 1776: [Usaco2010 Hol]cowpol 奶牛政坛
由题解可得(TAT)结论:某政党内部的最长路径一定有一个端点是政党内最深的一个点。。毕竟树的直径也有一个端点在叶子节点上?
先一遍dfs求出每个政党最深的点,然后求它和所在政党其他点的距离的最大值。。树上两点间的距离dis(i,j)=depth[i]+depth[j]-depth[lca(i,j)]*2。。
总时间复杂度O(nlogn)...求lca部分试了倍增和链剖两种。。。。代码长度差不多但是倍增慢多了QAQ
//链剖
//倍增
bzoj 1700: [Usaco2007 Jan]Problem Solving 解题
DP。。http://www.cnblogs.com/czllgzmzl/p/5068024.html
bzoj 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛
傻逼题。。二分答案+判定。。。。每次二分出一个答案mid后,贪心的划分,看一下能不能划出C段
bzoj 1741: [Usaco2005 nov]Asteroids 穿越小行星群
二分图最大匹配。。。存在小行星(i,j),连一条i到j+n的边。
dinic比匈牙利还是略慢。。
bzoj 1705: [Usaco2007 Nov]Telephone Wire 架设电话线
DPhttp://www.cnblogs.com/czllgzmzl/p/5068259.html
bzoj 1783: [Usaco2010 Jan]Taking Turns
有点算博弈相关?http://www.cnblogs.com/czllgzmzl/p/5069730.html