USACO 2021赛季 简要题解

感觉 2021 赛季的难度 >> 2022 的啊 QwQ

缺少大胆设计的感觉!

DEC

GOLD - A - Replication G

  • 给定 \(n\times n\) 的地图,有若干可能的起点,空地和障碍物。
  • 初始有机器人在起点,每 \(d\) 个单位时间机器人会向四周复制,原本的也会保留。
  • 每个单位时间可以选择四个方向之一移动一格,也可以选择不动
  • 求某个时刻可能存在过机器人的所有格子总数。
  • \(n\leq 1000,d\leq 10^9\)

翻译和原始题意均未提及可以选择不动,导致这题始终对我来说十分神秘/ll

如果这样,可以简单处理出能否到达每个格子,如果一个格子能到达就肯定会极大扩展。

令扩张系数每次 \(-1\),所有系数 \(>0\) 的就是答案。

GOLD - B - Bovine Genetics G

  • 给定基因序列字符串包含 A,G,C,T
  • 对于所有字符串做如此变换:在所有连续相等的字符之间切开,并翻转每一段后再合并。
  • 给出变换后的字符串,有一些位可能是 ?,求可能的初始序列个数。
  • \(n\leq 10^5\)

所谓的 key observation 是一个变换后的序列和初始序列形成双射,考虑对合法的终止序列计数。

发现需要将序列划分为几段,使得段内没有连续相等的字符,且对于相邻的两段,前一段的段首 \(=\) 后一段的段尾。

直接设 \(f(i,a,b,c)\) 表示考虑前 \(i\) 位,上一段的段首是 \(a\),当前段的段首是 \(b\),上一次填的字符是 \(c\),转移随便写。

GOLD - C - Square Pasture G

  • 给定 \(n\) 个点,坐标分别为 \((x_i,y_i)\),保证所有点的 \(x,y\) 坐标各不相同。
  • 求用正方形能够框出的本质不同点集个数,包括空集,正方形顶点必须是整点。
  • \(n\leq 200, x_i,y_i\leq 10^9\)

从没想过这题还能有如此简洁的做法,1 年前的我可是崩溃了的啊 QwQ

考虑如何去重,只要在一个点集的极小正方形计算它。

考虑总可以将正方形平移至 上侧和左侧 卡住,而如果此时 右侧和下侧 均未被卡住就可以收缩边长。

所以一个正方形总是有一对边界被卡住的,仅考虑上下边界,之后可以翻转图形再做一遍,同时卡住边界的注意去重即可。

考虑将点当作 pair 排序,之后枚举任意一个区间的左右端点当卡住上下边界的点,发现恰好枚举了:

  • 卡住上边界的最左侧的点。
  • 卡住下边界的最右侧的点。

然后双指针扫一遍即可,因为边长已经固定了所以细节非常少,复杂度 \(O(n^3\log n)\)

Platinum - A - Sleeping Cows P

  • 给定 \(n\) 只奶牛和 \(n\) 个牛棚,奶牛只能和容积 $\geq $ 它的体积的牛棚匹配,求不同极大匹配个数。
  • \(n\leq 3000\)

因为印象太深刻了,所以太深刻了(

将奶牛作为左括号,牛棚作为右括号,统一排序。

相当于统计括号匹配的方案数,要求没有同时两个 左右括号 没被选,且左括号在右括号的左侧。

DP 是简单的。

Platinum - B - Spaceship P

  • 给定 \(n\) 个点的无向图,可能有自环,无重边。以及一个 \(m\) 个按钮的按钮器。
  • 每到达一个房间就要按下一个按钮,这个按钮一定要是激活状态的。
  • 初始所有按钮均激活,每次按下一个按钮后,它会变成 未激活 状态,同时所有编号比它小的按钮均会变成已激活。
  • \(q\) 次询问,每次给定初始房间 \(s\) 和目标房间 \(t\),以及要求在 \(s\) 按下按钮 \(bs\),在 \(t\) 按下 \(bt\)
  • 求合法的路径数。两条路径不同当且仅当 路径本身不同 或 按钮序列不同。
  • \(n,m,q\leq 60\)

比较震撼。

初始想法是将路径和按钮分开考虑,因为真正和按钮相关的只是路径长度。

但是发现很多不足,因为按钮序列的最大长度可以用 \(f(i)=2f(i-1)+1\) 来递推,当 \(m=60\) 显然是不能接受的。

同时也不太知道从 钦定的按钮 出发到 钦定的按钮 结束的方案数。

实际上需要仔细观察按钮序列的性质,显然 \(2^m\) 的状态量是不能接受的。

发现一个按钮序列合法,当且仅当它有唯一的最大值 \(\max\),且根据它的位置将序列划分为至多两个子段后,两个子段依然合法。

考虑如果状态只保留 \(\max\) 能否呢?答案是可以的。

\(f(c,u,v)\) 表示从 \(u\to v\),使得所有按钮均 \(\leq c\) 的合法路径数。转移是简单的:

\[f(c,u,v) = f(c-1,u,v)+ \sum_{(x,k)}\sum_{(k,y)} f(c-1,u,x) f(c-1,y,v) \]

要么全程 \(\leq c-1\),要么有唯一的 \(k\) 取到了最大的按钮。

不难先枚举 \(k\) 来做到 \(O(n^4)\),需要注意一些细节,比如路径只有两个点一条边 \((u,v)\) 这种。

很容易拓展到钦定了初始和终止点的按钮,只需要巧妙的多添加 \(q\) 个虚点,这些点作为初始的时候要求 \(c=bs\),终止要求 \(c=bt\) 即可。

总体来说这题十分巧妙,将指数级的状态用最高位简单替代,同时通过添加虚点避免了诸多讨论,复杂度 \(O(n^2m(n+q))\)

Platinum - C - Cowmistry P

  • 给定 \(n\) 个不连续值域区间 \([l_i,r_i]\),求在区间内选择三个整数使得两两异或和 \(\leq k\) 的方案数。
  • \(n\leq 2\times 10^4,0\leq l_i\leq r_i\leq 10^9,k\leq 10^9\)

\(t\) 为最小的满足 \(2^t>k\) 的数。

将数根据 \(/2^t\) 分类,显然不同类不能同时选,不然异或和 \(>t>k\)

在同类中根据 \(/2^{t-1}\) 分两类,同类能随便选 \(\binom{x}{3}\),否则一定是一类选两个一类选一个。

枚举那个一个,相当于求另一类中有多少和他异或 \(\leq k\),如果直接用 trie 会 MLE,但是仔细思考发现这一经典问题可以直接前缀和维护贪心简单解决。

正解则和这些讨论没有什么关联。

考虑直接使用 trie 树,首先要解决的是空间问题,显然不能支持这么多数的插入,但是发现很多 trie 树节点其实是满二叉树!

考虑连出一条相邻节点连有两条边的链,它虽然不是树但和 trie 树上的满二叉树等价,却只使用了 \(O(\log V)\) 个节点。

采用类似线段树的方式就能建出这个 “trie DAG”,同时也证明了节点数是 \(O(n\log V)\) 的。

然后考虑一个直接的 DP,从高到低,根据 \(k\) 的这一位是 \(0\) 还是 \(1\) 讨论。

先设 \(f(x)\) 表示以 \(x\) 为根的子树的答案。如果 \(k\) 的这一位是 \(1\),则可能出现两个走一边,一个走一边的情况。

需要辅助数组 \(g(x,y)\) 表示两个点在 \(x\) 的子树,一个在 \(y\) 的子树的答案。

同时 \(g\) 的转移还需要辅助数组 \(h(x,y)\) 表示一个在 \(x\) 一格在 \(y\) 的答案。

转移是很简单的,但是初看上去状态总量是 \(O((n\log V) ^2)\),十分不可接受。

但是实际上不难发现,能够到达 \((x,y)\),当且仅当两个点在同一层,且两个点代表的数字的异或和等于 \(k\) 的一个前缀。

也就是说,对于一个 \(x\),出现在状态中的 \(y\) 是唯一的!

JAN

GOLD - A - Uddered but not Herd G

  • 给定字符串,求至少重复几遍字母表能使得该字符串为子序列,字母表可以任意排布。
  • \(n\leq 10^5\),字符集大小 \(\leq 20\)

简单状压,注意到最少重复次数只需要在断层处贪心就好了,所以贡献之和相对顺序有关。

容易做到 \(O(n2^n)\)

GOLD - B - Telephone G

  • 给定一排 \(n\) 个点,从 \(i\to j\) 的代价为 \(|i-j|\)
  • 每个点有颜色 \(a_i\),值域为 \(k\),有的颜色之间可以单向传递,求 \(1\to n\) 的最小代价。
  • \(n\leq 5\times 10^4,k\leq 50\)

非常直觉的分层图,建立 \(k+1\) 层图,\(1\sim k\) 表示对应编号的颜色,相邻数之间连双向 \(1\) 边。

同时对每个点建立 \((a_i,i)\to (k+1,i)\)\(0\) 边,以及如果颜色 \((a_i,j)\) 能传递,那么建立 \((k+1,i)\to (j,i)\)\(0\) 边。

起点是 \((k+1,1)\) 终点是 \((k+1,n)\),直接跑最短路就行了。

GOLD - C - Dance Mooves G

  • \(n\) 只奶牛,初始第 \(i\) 只奶牛在位置 \(i\)
  • 给定长度为 \(k\) 的操作序列,每个操作形如 \((i,j)\),表示交换 \(i\) 位置和 \(j\) 的奶牛,每秒执行一个操作。
  • 操作序列循环,求 \(m\) 秒后每只奶牛曾经到过的不同位置数。
  • \(n\leq 10^5,k\leq 2\times 10^5,m\leq 10^{18}\)

很简单的题,注意到一轮操作后所有点到过的总位置数是 \(O(k)\) 的,所以只需要对每个置换环双指针即可。

如果 \(m\) 过大则直接遍历到整个置换环。

Platinum - A - Sum of Distances P

  • 给定 \(n\) 个连通无向图 \(G_i=(V_i,E_i)\)
  • 据此构造一张 \(n\) 维无向图,两个点 \((a_1,a_2,\cdots ,a_n)\)\((b_1,b_2,\cdots ,b_n)\) 之间有边,当且仅当 \(\forall i,(a_i,b_i)\in E_i\)
  • 求所有与 \((1,1,\cdots, 1)\) 连通的点到它的最短路之和。
  • \(n\leq 5\times 10^4,\sum |V_i|\leq 10^5,\sum |E_i|\leq 2\times 10^5\)

不难发现两个点之间有路径,当且仅当存在奇偶性相等的路径。

处理出每张图中,\(1\) 到每个点的 奇最短路 和 偶最短路,那么到一组点的最短路径就是最大值。

虽然不知道真正的最短路是奇还是偶,但是可以直接分开计算,再用它们的 \(\max\) 容斥掉即可。

Platinum - B - Minimum Cost Paths P

  • 给定 \(n\times m\) 的网格,从 \((x,y)\) 出发可以:
    • 花费 \(x^2\) 的代价走到 \((x,y+1)\)
    • 花费 \(c_y\) 的代价走到 \((x+1,y)\)
  • 询问 \(q\) 次,每次求从 \((1,1)\) 走到 \((x_i,y_i)\) 的最小代价。
  • \(n\leq 10^9,m\leq 2\times 10^5,q\leq 2\times 10^5\)

经典保序回归 \(L_2\) 的特殊情况特解。

首先需要一些转化,相当于对每列求 \(s_j\) 表示在 \((s_j,j)\) 进入下一行,\(s_0=1\),那么代价就是:

\[c_y(x-s_{y-1})+\sum_{j=1}^{y-1} s_j^2+c_j(s_j-s_{j-1}) \]

将求和项中的数字化为仅和 \(j\) 有关:

\[c_yx-c_1+\sum_{j=1}^{y-1} s_j^2+s_j(c_j-c_{j+1}) \]

将后面的式子配方,前面的常数省去,得到:

\[\sum_{j=1}^{y-1} (s_j-\frac{c_{j+1}-c_j}{2})^2-\frac{(c_{j+1}-c_j)^2}{4} \]

后面同样是常数,前面的 \(\dfrac{c_{j+1}-c_j}{2}\) 是常数,同时 \(s\) 需要满足的性质是 \(s_j\leq s_{j+1}\),于是变成了经典的链上 \(L_2\) 问题。

首先看经典链上 \(L_1\) 问题:Sequence 数字序列。它需要最小化:

\[\sum_{i=1}^n |a_i-b_i|,(b_i\leq b_{i+1}) \]

其中 \(a_i\) 为给定常数。

定义 \(L_1\) 均值为使得 \(\sum_{i=1}^n |a_i-k|\) 最小的 \(k\),容易发现就是中位数。

同时可以证明,对于 \(a_i>a_{i+1}\),最优情况下一定有 \(b_i=b_{i+1}\)。(利用假设极小偏移量 \(\varepsilon\)

据此可以得到一个单调栈维护的贪心算法:

  • 单调栈中元素为:\((S_i,k_i)\),分别表示集合和决策点。
  • 每次遇到一个数,则插入 \((\{i\},a_i)\)
  • 对于栈中,如果有 \(k_i<k_{i-1}\),那么将两个元素合并为 \((S_i\cup S_{i-1},\text{medium}(S_i\cup S_{i-1}))\),后者表示 \(a_i\) 的中位数。
  • 最后对于 \((S_i,k_i)\),集合中的下标的 \(b\) 就决策为 \(k_i\)

实际上真正的 \(L_1\) 问题是:\(\sum w_i|a_i-b_i|\) 的最小化,此时 \(L_1\) 均值变为加权中位数。

而对于 \(L_2\) 问题则是最小化 \(\sum w_i(a_i-b_i)^2,b_i\leq b_{i+1}\),可以证明 \(L_2\) 均值为加权平均数,即 \(\dfrac{\sum w_i a_i}{w_i}\)

在本题中也是一样,直接使用类似的贪心方式即可,形式上比 \(L_1\) 均值甚至更简单,因为平均数的维护比合并中位数来的简便。

但是这题中还有别的限制,那就是 \(s_i\in \N*\)\(s_i\in[1,x]\)

可以证明,\(L_2\) 问题有值域限制时,可以直接向值域集合取整,即 \(<1\) 的变成 \(1\)\(>x\) 的变成 \(x\),需要是整数则直接四舍五入即可。

Platinum - C - Paint by Letters P

  • 给定 \(n\times m\) 的颜色矩阵,每次询问一个子矩阵,求子矩阵中同色四连通块的个数。
  • \(n,m,q\leq 2000\)

欧拉定理的直接应用。

根据 \(F+V-E=C+1\)。要求的就是 \(V,E,F\),一个一个来。

对于 \(V\),很简单,就是 \((x_2-x_1+1)(y_2-y_1+1)\)

对于 \(E\),二位前缀和处理。

对于 \(F\),考虑首先将空格当作点处理出所有连通区域,和外部连通的算一整个。

之后对于每个不与外部连通的区域取一个关键点进行标记,每次二位前缀和查询区域数。

但是一个区域属于一个子矩阵,仅依靠关键点判断是必要不充分的,但是不难发现不充分的情况一定有区域在边界。

于是能够得到一个子矩阵周长相关的算法,这是可以接受的,因为周长是 \(O(n+m)\) 的。

FEB

GOLD - A - Stone Game G

  • 给定 \(n\) 堆石子,博弈过程如下:
    • 先手选择一堆至少有 \(s_1\) 个石子的位置,并取走 \(s_1\) 个。
    • 后手选择一堆至少有 \(s_2\) 个石子的位置,并取走 \(s_2\) 个,并要求 \(s_1|s_2\)
    • 依次交替,每次均要满足 \(s_{i-1}|s_i\),不能操作者输。
  • 求先手必胜的第一步方案数,取的石子不同或取的位置不同均算不同方案。
  • \(n\leq 10^5,a_i\leq 10^6\)

挺有意思的博弈题。考虑枚举第一次取的石子数 \(v\),令 \(b_i=\lfloor a_i/v\rfloor\),即第 \(i\) 堆能被取几次。

假设先手能取任意 \(v\) 的倍数,对于 \(x=\max b_i\),如果 \(\sum |b_i=x|\) 为奇数,那么只要第一步选 \(vx\) 个先手就赢麻了。

否则肯定没人会主动取减少 \(\max\) 的情况。

考虑次大值 \(x'\),发现是同样的情况,如果是奇数,那么先手果断选 \(vx'\),要么后面没的选了,要么不得不主动改变 \(x\)

于是当先手能选择任意 \(v\) 的倍数时,后手必胜当且仅当所有 \(b_i\) 的出现次数为偶数。

于是这里的先手必胜,当且仅当取一次 \(v\) 后能送给后手全部为偶数的局面。

要么是两个连续的奇数,要么唯一一个奇数是 \(x=1\) 即可。复杂度是关于值域的调和级数的。

GOLD - B - Modern Art 3 G

  • 给定目标序列,求最小染色次数。
  • 每次可以给一个区间染同一种颜色,后染的会覆盖先染的区域。
  • \(n\leq 300\)

果断区间 DP。

如果 \(a_l=a_r\) 就通过 \(f_{l+1,r}\) 转移,因为染 \(r\) 的那一次顺便染 \(l\) 即可。

否则一定没有全局的染色,同时容易证明没有一个点使得所有染色区间都跨过它,于是直接划分转移即可。

GOLD - C - Count the Cows G

  • \(q\) 次询问,求 \((x_i,y_i)\)\((x_i+d_i,y_i+d_i)\)\(d_i+1\) 个点中。
  • 横纵坐标 \(3\) 进制表示下的每一位奇偶性均相等的个数。
  • \(q\leq 10^4,x_i,y_i,d_i\leq 10^{18}\)

果断数位 DP,设 \(f(o,x_0,y_0,0/1)\) 表示考虑了前 \(o\) 位,\(x\) 的进位为 \(x_0\)\(y\) 的进位为 \(y_0\)\(d\) 是否顶到上限的方案数即可。

Platinum - A - No Time to Dry P

  • 给定有颜色深浅的序列,\(m\) 次询问一个区间,求最少染色多少次能够得到该区间。
  • 每次染色可以染一个连续区间,只有较深的颜色能覆盖较浅的。
  • \(n,m\leq 2\times 10^5\)

每个数字记录 \(\text{pre}\),表示最近的与它同色且中间颜色都比它深的点的位置,二维数点即可。

Platinum - B - Minimizing Edges P

  • 给定连通无向图,设 \(f_G(a,b)\) 表示是否有从 \(1\) 出发到达 \(a\) 的长度为 \(b\) 的路径。
  • 要求构造无向图 \(G'\) 使得 \(f_G=f_{G'}\),且最小化 \(G'\) 的边数,输出最小边数。
  • \(n\leq 10^5,m\leq 2\times 10^5\)

发现有关的只是奇最短路和偶最短路,设 \((x,y)\) 表示奇偶最短路对,约定 \(x<y\)

发现连边有且仅有两种:

  • \((x,y)\)\((x-1,y-1)\)
  • \((x,y)\)\((x+1,y-1),(x-1,y+1)\)

因为有直接连边的 \(|\Delta|\) 一定 \(\leq 1\),同时需要得到 \((x,y)\)

将图形转化到坐标系上发现可以按照对角线(即 \(x+y\))决策,只有第一类边是跨界的。

针对第二类边,发现是相邻项之间的连边,同时边界条件是 \(y=x+1\),此时 \((x+1,y-1)=(x,y)\)

按照 \(x\) 升序考虑,相当于向右的边变成了内部连边。

第二类链的连边代价是 \(1\) 加上最后边界的近似 \(0.5\),而第一类边显然是 \(1\) 的代价。

所以有很自然的贪心策略:对于有需求的使用链传递,闲置的点直接使用一类边。

Platinum - C - Counting Graphs P

B 的计数版本,被毒瘤到了 QwQ

OPEN

GOLD - A - United Cows of Farmer John G

  • 给定序列,求两端点与区间内任意其它数不同 的区间个数。
  • \(n\leq 2\times 10^5\)

随便扫一遍维护一下就好了。

GOLD - B - Portals G

  • 给定多个不连通的环,每次操作可以花费一定代价将两个不相交的环变成 \(\infty\) 状物。
  • 求将整个图变得连通的最小代价。
  • \(n\leq 10^5\)

实际上题目难度在于转化到这个简化题面上,然后就是个最小生成树的板子。

GOLD - C - Permutation G

  • 给定 \(n\) 个平面内任意 \(3\) 点不共线的点,求排列数。
  • 使得按排列顺序加点,每次将新加入的点尝试与已有点相连,有且仅有 \(3\) 条线段与已有线段不交,并保留那 \(3\) 条线段。
  • \(n\leq 40\)

知道是个 DP,发现确定最大的外围三角形后内部的点可以任意排列,完全等价。

所以设 \(f(s,i,j,k)\) 表示已经加入了 \(s\) 个点,外围三角形为 \((i,j,k)\) 的方案数。转移分两种,内部新加入点,或者是扩大外围三角形。

Platinum - A - United Cows of Farmer John P

  • 给定序列,求两端点及内部再选一点,使得这三点的数字区间中唯一 的区间个数。
  • \(2\times 10^5\)

带 单点激活/删除 的线段树扫一遍即可。

Platinum - B - Routing Schemes P

  • 给定 \(n\) 个点的有向图,\(m\) 个起点和 \(m\) 个终点。
  • 求任意起点终点匹配的路径数,使得每条边被切仅被覆盖一次。
  • \(n\leq 100\)

建立超集点之后发现就是欧拉回路计数,变成 BEST 定理板子。

Platinum - C - Balanced Subsets P

  • 给定 \(01\) 矩阵,求凸的全 \(1\) 子图形的个数。
  • \(n\leq 150\)

经典 DP 题,记录左右列以及当前正在上升/下降的状态:\(f(l,r,0/1,0/1)\)

每一行前缀和优化一下转移即可做到 \(O(n^3)\)

posted @ 2022-09-28 21:19  LPF'sBlog  阅读(145)  评论(0编辑  收藏  举报