「个人」USACO 做题记录
\(\text{BRONZE铜}\)
\(\text{SLIVER银}\)
\(\text{2016 DECEMBER}:\)
-
P3184 [USACO16DEC]Counting Haybales S
二分查找,每次用 \(2\log_2\) 的时间找出最大的小于 \(A\) 的位置和最小的大于 \(B\) 的位置,总复杂度 \(O(2Q\log_2n)\)。
-
由于数据范围比较小,直接考虑朴素解法即可。
参考 \(\text{SPFA}\) 的做法,广搜,枚举每一个点能到达的最远距离,总复杂度 \(O(n^3)\)。
-
P3405 [USACO16DEC]Cities and States S
哈希的练习题。
输入时存储两个数组,然后将哈希值用二维数组存储下来,每次累计相反的出现次数。
\(\text{2005 JANUARY}:\)
-
找规律就可以了。
得到递推方程:
\(i\) 为奇数时:\(f(i)=f(i-1)\),
\(i\) 为偶数时:\(f(i)=f(i-1)+f(i/2)\)。
-
P6067 [USACO05JAN]Moo Volume S
先排序。
记 \(pre_x\) 为 \(\sum_{i=1}^{x-1} a_i\),
记 \(suf_x\) 为 \(\sum_{i=x+1}^{n} a_i\)。
显然,每一个 \(i\) 的贡献都是
\(\lvert a_i×(i - 1) -pre_i \rvert\) \(+\) \(\lvert a_i×(n-i)×suf_i \rvert\)。
\(O(n)\) 预处理 \(O(n)\) 计算答案。
总复杂度 \(O(n)\)。
-
欧拉回路模板题。
总复杂度 \(O(n+m)\)。
\(\text{2010 DECEMBER}:\)
-
P3003 [USACO10DEC]Apple Delivery S
\(Dijkstra\) 求最短路模板,怎么是蓝的。
两种路线:
\(1.\) pb 到 pa1 到 pa2。
\(2.\) pb 到 pa2 到 pa1。
取较短的即可!
-
P3004 [USACO10DEC]Treasure Chest S
DP练习题。
设 \(f_{l, r}\) 为 \(l\) 到 \(r\) 能取的最大值,\(sum\) 为前缀和。
易得转移方程 \(f_{l, r}=sum_r-sum_l-\min(f_{l+1, r},f_{l, r-1})\)。
但是这题它卡空间,这样只有 \(90\) 分。
观察转移方程,发现 \(\min\) 里面的东西有点多余,将 \(f_{l, r}\) 中的 \(r\) 压掉,变为 \(f_l\) 表示以 \(l\) 为起点,能取得最大值。
那么转移方程就能变为 \(f_l=sum_r-sum_l-\min(f_{l+1},f_{l})\)。
-
P3005 [USACO10DEC]The Trough Game S
有一个朴素做法。
枚举所有可能的序列,然后判断是否满足所有条件。
复杂度为 \(O(2^nnm)\),能过!
\(\text{2019 FEBRUARY}:\)
-
P5541 [USACO19FEB]Sleepy Cow Herding S
关于求最小值:
最后的奶牛序列长度为 \(n\),所以我们只要找到一条长度为 \(n\) 且包含奶牛最多的线段即可。然后将端点外的奶牛挪到空隙当中就可以了。设这条线段中奶牛有 \(x\) 头,那么最小值就是 \(n-x\) 即可。
但是还需要特判最小值为 \(2\) 的情况,如 2,4,5,6,7 时答案为 \(2\)。
关于求最大值:
因为奶牛移动后不能变为端点,所以我们要将 \(1\) 号奶牛移动到 \(2\) 号奶牛和 \(n\) 号奶牛之间,或者将 \(n\) 号奶牛移动到 \(1\) 号奶牛和 \(n-1\) 号奶牛之间。然后最后将答案减去 \(n-2\),因为移动时端点不需要移动。
-
P5542 [USACO19FEB]Painting The Barn S
认真阅读题面后发现,题目要我们完成两个操作。
\(1.\) 二维加法
\(2.\) 单点查询显然暴力模拟无法通过,那我们就能想到一些技巧:二维线段树,二维树状数组,二维差分。
在此题中我们可以使用简单好写的二维差分,该知识点属于普及组范围,不做讲解。给出一篇文章,若不会该知识点可以学习。
那么这样,二维加法和单点查询的时间复杂度均为 \(O(1)\),完全可以通过。
-
P5543 [USACO19FEB]The Great Revegetation S
我们可以采用并查集补集的思想,种同种草作为“朋友”关系,种不同草作为“敌对”关系。这样我们就可以处理冲突的情况。
无论所有关系,都是两种奶牛捆绑,也就是说要开一个并查集维护这些关系。
方案数也就是 \(2^{集合数量}\),转化为二进制就是一个 \(1\) 加上 \(2^{集合数量}\) 个 \(0\)。
\(\text{2021 DECEMBER}:\)
-
P7991 [USACO21DEC] Connecting Two Barns S
\(1.\) 不连边;\(2.\) 连一条边;\(3.\) 连二条边。
我们可以把第二种和第三种情况放在一起操作。
第一种情况:
当 \(1\) 和 \(n\) 在同一集合时,花费为 \(0\)。
第二&三种情况:
写一个求出任意两个集合的最短距离的函数,就可以求出第二种情况的代价。
对于第三种情况,我们枚举中转集合,计算最小代价。
如果直接遍历集合中所有元素的话,时间复杂度有点危险。
于是可以使用二分查找,找到与当前点花费最小的点,这样就可以过了。
-
P7992 [USACO21DEC] Convoluted Intervals S
由于 \(a_i+a_j\le k \le b_i+b_j\),那么我们可以想到,对于区间 \([a_i+a_j,b_i+b_j]\) 全部加一。
这样我们可以用差分思想,将 \(c_{a_i+a_j} ++\) 且 \(c_{b_i+b_j+1} --\)。
但是这样是 \(O(n^2)\) 的,无法通过。
我们观察到 \(a\) 数组和 \(b\) 数组的范围为 \(5000\),可以用桶存储。
那么这样就可以改为遍历值域,优化为了 \(O(m^2)\)。
另外要运用加乘原理,小学就学过了,差分操作时把出现次数相乘即可。