首页 > 技术文章 > 「个人」USACO 做题记录

chenyuhe 2021-12-12 11:11 原文

\(\text{BRONZE铜}\)


\(\text{SLIVER银}\)

\(\text{2016 DECEMBER}:\)

  • P3184 [USACO16DEC]Counting Haybales S

    二分查找,每次用 \(2\log_2\) 的时间找出最大的小于 \(A\) 的位置和最小的大于 \(B\) 的位置,总复杂度 \(O(2Q\log_2n)\)

  • P3416 [USACO16DEC]Moocast S

    由于数据范围比较小,直接考虑朴素解法即可。

    参考 \(\text{SPFA}\) 的做法,广搜,枚举每一个点能到达的最远距离,总复杂度 \(O(n^3)\)

  • P3405 [USACO16DEC]Cities and States S

    哈希的练习题。

    输入时存储两个数组,然后将哈希值用二维数组存储下来,每次累计相反的出现次数。


\(\text{2005 JANUARY}:\)

  • P6065 [USACO05JAN]Sumsets S

    找规律就可以了。

    得到递推方程:

    \(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)\)

  • P6066 [USACO05JAN]Watchcow S

    欧拉回路模板题。

    总复杂度 \(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}:\)

  • P7990 [USACO21DEC] Closest Cow Wins S

  • 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)\)

    另外要运用加乘原理,小学就学过了,差分操作时把出现次数相乘即可。


\(\text{GOLD金}\)


\(\text{PLATINUM铂金}\)

推荐阅读