USACO 2020赛季 简要题解

DEC

GOLD - A - Milk Pumping G

  • 给定 \(n\) 个点 \(m\) 条边的无向图,每条边有价格和流量。
  • 一条路径的总价 \(c\) 为路径上所有边的价格之和,总流量为所有边流量的 \(\min\)
  • 求 总价/总流量 的最大值。
  • \(n,m\leq 1000\)

从小到达枚举流量然后暴力跑最短路……

GOLD - B - Milk Visits G

  • 树上 \(m\) 次询问路径上是否有某种颜色。
  • \(n,m\leq 10^5\)

离线 dfs 一遍就好。

GOLD - C - Moortal Cowmbat G

懒得概括题意~ 简单 DP。

Platinum - A - Greedy Pie Eaters P

  • 给定 \(n\) 个带权区间,求选择权值和最大的区间集合。
  • 使得存在一种顺序进行区间覆盖,使得每次覆盖的区间都不被之前区间的并集完全包含。
  • \(n\leq 300\)

区间 DP,考虑一个区间只需要留一个空位给它覆盖就行。

那么每次枚举空位的位置进行划分,预处理 \(g_{l,r,k}\) 表示完全在区间 \([l,r]\) 内切经过 \(k\) 的权值最大的区间即可。

Platinum - B - Bessie's Snow Cow P

  • 树上 \(m\) 次操作,每个点维护一个颜色不可重集合,每次子树添加一种颜色,或者查询子树集合大小之和。
  • \(n,m\leq 10^5\)

子树问题用 dfs 序转区间问题,然后 set 每种颜色维护连续区间,每次对空位直接暴力区间 \(+1\)

考虑每个区间只会被合并 \(1\) 次,所以均摊复杂度正确。

Platinum - C - Tree Depth P

  • 求逆序对数恰好为 \(k\)\(n\) 阶排列构成的小根堆笛卡尔树上,每个位置的深度和。
  • \(n\leq 300\)

所以生成函数解释背包自然,还是直接组合意义来的自然呢?

从子子问题入手,考虑逆序对数恰好为 \(k\)\(n\) 阶排列计数。

抛开一半的值域从小到大填的思路,而是直接填数字,动态调整数字的相对大小,这样第 \(i\) 个填的数字对逆序对的贡献还是 \([0,i-1]\)

相当于一个简单的分组背包,可以前缀和优化到 \(O(n^3)\)

这样考虑的好处是,组合意义上数字可以以任何顺序乱填,只和它是第几个填的有关。

考虑统计贡献,对于位置 \(i\),它的深度 \(=\) 它的祖先个数 \(+1\),祖先就是比 \(a_i\) 小且 \(i\)\(j\) 之间的数都比 \(a_j\) 大。

既然知道结果与数的加入顺序无关,考虑在 \(j\) 最容易统计的时候加入它,也就是刚好加入完 \(i,j\) 之间的数(包括 \(i\) 不包括 \(j\))的时候。

这样逆序对贡献就是 \(\max(0,i-j)\),然后顺手把 \(j\) 之前 \([0,|j-i|-1]\) 的贡献退背包退掉。

注意到退背包需要 \(O(n^2)\),枚举数对还要 \(O(n^2)\),不能接受。

但是不难发现 \(|i-j|\) 相等的推背包结果完全一样,考虑枚举差值的绝对值统一计算即可做到 \(O(n^3)\)

JAN

GOLD - A - Time is Mooney G

  • 给定 \(n\) 个节点 \(m\) 条边的有向图,每次到达一个节点都可以获得对应的收益 \(v_i\)
  • 旅行需要从 \(1\) 号节点出发并在此结束,走过一条边需要一天。
  • 由于 time is money,所以 \(t\) 天的旅行需要花费 \(c\times t^2\) 的代价。最大化收益 - 代价。
  • \(n,c,v_i\leq 1000,m\leq 2000\)

发现如果 \(\max v_i<c\times (t^2-(t-1)^2)\) 就一定不优,所以 \(t\) 是和 \(\max v_i\) 同级的。

随便写写就好了。

GOLD - B - Farmer John Solves 3SUM G

  • 给定长度为 \(n\) 的序列,\(m\) 次询问,每次询问一个子区间中满足 \(a_i+a_j+a_k=0\) 的无序三元组 \((i,j,k)\) 的个数。
  • \(n\leq 5000,m\leq 10^5,a_i\in[-10^6,10^6]\)

可以很方便的 \(O(n^2)\) 预处理 + \(O(1)\) 查询,人傻了写了个 HashTable,实际上值域很小只需要一个桶。

GOLD - C - Springboards G

  • 需要从 \((1,1)\) 走到 \((n,n)\),每次只能向上或向右走。
  • \(m\) 个跳板,可以从位置 \((x_{i1},y_{i1})\) 跳到 \((x_{i2},y_{i2})\),满足 \(x_{i2}\geq x_{i1},y_{i2}\geq y_{i1}\),且只花费一步的代价。
  • 求最小代价。
  • \(n\leq 10^9,m\leq 10^5\)

可以把起点和终点拆开将每个点按照 \(\text{pair}(x,y)\) 排序,这样只有左边的点能转移到右边的点。

可以从左往右扫一遍,用树状数组维护,在起点处计算贡献并转移到终点,终点则更新到树状数组。

降智套了个 CDQ 过了才发现分治了个寂寞,不过还是 \(O(m\log m)\) 的(

Platinum - A - Cave Paintings P

  • 给定 \(n\times m\) 画作,其中有石头和空气方格,四周一定是石头。
  • 求保持画作真实的情况下添加一些 水方格 的方案数,真实指满足连通器原理。
  • \(n,m\leq 1000\)

不同连通块的贡献最后乘起来就好,考虑直接从下往上扫,每次可能将一些当前连通块合并。

合并的代价显然是直接相乘,当然还需要 \(+1\) 对应的是这一层是满的,也就是整个当前连通块都是水。

Platinum - B - Non-Decreasing Subsequences P

  • 区间查询非降子序列个数,值域 \([1,k]\)
  • \(n\leq 50000,m\leq 2\times 10^5,k\leq 20\)

直接猫树分治,是 \(O(nk^2\log n+qk)\) 的。

前面可以用树状数组把一个 \(k\) 变成 \(\log k\),但是首先 \(k^2\) 本身就带 \(1/2\) 常数,树状数组套上来反而没有扫一遍数组来得快。

可以和 LNR 一道题很像的维护转移矩阵和逆矩阵的前缀和,做到 \(O(nk^2+qk)\),比较妙妙。

Platinum - C - Falling Portals P

  • 平面内有 \(n\) 个点,初始第 \(i\) 个点在 \((i,a_i)\)
  • 每个时刻第 \(i\) 个点会以 \(i\) 的速度下落,即沿 \(y\) 轴负方向移动。
  • 如果任意时刻两个点的 \(y\) 坐标相同,那么它们会在这一瞬间建立起传送门,你可以立刻在两者之间穿梭。
  • 对每个 \(i\),求从 \(i\) 出发到达 \(q_i\) 的最短耗时,以最简分式的方式输出,或者判断无解输出 \(-1\)
  • \(n\leq 2\times 10^5,a_i\leq 10^9\)

厉害题。

发现,如果一个点的目标是初始比自己更高的点,那么任何时刻它如果和比自己下落更慢的点联通他就一定会过去。

因为走的更慢一定是更优的,对走到更低的点也是同理。

也就是说,每个点在两种询问下都有唯一的 \(\text{nxt}\)

无论是根据 \(O(n^2)\) 的暴力还是简单画画图,都能发现一个点实际上在一个凸包上移动,它的 \(\text{nxt}\) 就是那个时刻凸包上它的后继节点。

单调栈处理出 \(\text{nxt}\) 然后暴力跳就能得到 \(\text{92pts}\) 的高分,不难发现这些边构成森林,于是倍增即可,复杂度 \(O(n\log n)\)

FEB

GOLD - A - Timeline G

  • 求字典序最小的序列,满足 \(a_i\in[1,m]\) 且满足 \(c\) 条形如 \(a_i\geq a_j+k\) 的限制 \((i,j,k)\)
  • \(n,c\leq 10^5,m\leq 2\times 10^5\)

差分约数裸题。

GOLD - B - Help Yourself G

  • 给定一些线段,求所有 \(2^n\) 种选择线段的方案的连通块数之和。
  • \(n\leq 10^5\)

能想到类似 P 的 C 的线段树维护方法,但是没想到有更简洁的做法。

考虑在每个连通块左端点处统计它,发现贡献是独立的。

对于线段 \((l_i,r_i)\),只需要差分预处理出覆盖 \([l_i-1,l_i]\) 的线段个数 \(s\),它的 \(l_i\) 能作为左端点的方案数就是 \(2^{n-1-s}\)

GOLD - C - Delegation G

  • 给定一棵树,对每个 \(k\in[1,n-1]\),判断是否存在一种链划分使得所有链长度恰好为 \(k\)
  • \(n\leq 10^5\)

发现只有 \(n-1\) 的约数有可能成立,且每个非根子树必须上传一条链。

又因为子树内链长度和是固定的 \(\text{siz}-1\),所以上传的链的长度也是固定的,只需要在每个根处检验能否匹配即可。

可以双指针解决。

Platinum - A - Delegation P

  • 给定一棵树,求最大的正整数 \(k\) 使得存在一种链划分使得所有链长度 \(\geq k\)
  • \(n\leq 10^5\)

直接二分答案,每个非根子树必须恰好传一条链上去,链长肯定是越长越好。

能传上去的链是有单调性的,直接在每个子树处二分 + 贪心匹配即可。

Platinum - B - Equilateral Triangles P

  • 给定 \(n\times n\) 的方阵,统计两两曼哈顿距离相等的三元组个数。
  • \(n\leq 300\)

核心性质发现,曼哈顿等边三角形一定有两个点构成 \(45^{\circ}\) 的直线。

敏感性还是要有的,直接转切比雪夫,然后就能发现一定是:两个点为一个正方形一条边的两个顶点,另一个点在对边上任意处。

根据两个点是水平还是竖直的要做两次,注意如果第三个点也在顶点处会算重。

简单回忆:

曼哈顿与切比雪夫距离的转化。

  • 原图 \((x,y)\) 的曼哈顿距离 \(=\) 新图 \((x+y,x-y)\) 的切比雪夫距离。
  • 原图 \((x,y)\) 的切比雪夫距离 \(=\) 新图 \((\cfrac{x+y}{2},\cfrac{x-y}{2})\) 的曼哈顿距离。

对于两点 \((x_1,y_1),(x_2,y_2)\),曼哈顿距离是 \(|x_1-x_2|+|y_1-y_2|\),切比雪夫距离是 \(\max(|x_1-x_2|,|y_1-y_2|)\)

Platinum - C - Help Yourself P

  • 给定一些线段,求所有 \(2^n\) 种种选择线段的方案的连通块数 \(k\) 次方之和。
  • \(n\leq 10^5,k\leq 10\)

这时候 GOLD 的 A 中想到的线段树做法就有了作用。

对于线段按照 \(l\) 升序排序,在线段树上维护每个当前连通块最右端点为 \(r\) 时的答案。

对于右端点 \(x\) 讨论当前线段 \((l,r)\) 的影响:

  • \(x\in[0,l)\):新增的线段会新增连通块,均转移到 \(r\)
  • \(x\in[l,r]\):新增的线段不会有影响,但右端点变成了 \(r\),容易加到 \(r\) 即可。
  • \(x\in(r,2n]\):是否选择当前线段均不会有任何影响,区间 \(\times 2\)

注意需要在每个位置处维护 \(0\sim k\) 次方的值,为的是第一处转移的二项式定理。

复杂度 \(O(nk\log n + nk^2)\)

OPEN

GOLD - A - Haircut G

  • 给定长度为 \(n\) 的序列,对每个 \(k\in[0,n)\),求将 \(>k\) 的数都变为 \(k\) 后序列的逆序对个数。
  • \(n\leq 10^5,a_i\in[0,n]\)

简单树状数组入门题,求出差分数组即可。

GOLD - B - Favorite Colors G

  • 给定有向图,\((u,v)\) 表示 \(v\) 牛钦慕 \(u\) 牛。每只奶牛有自己最爱的颜色 \(c_i\)
  • 若两只牛都有钦慕最爱颜色相同的牛,那么它们必须最爱同一种颜色。
  • 求构造字典序最小的颜色序列,满足不同种类颜色数尽量多。
  • \(n,m\leq 2\times 10^5\)

将指向同一个点的所有儿子们合并即可,合并后直接将连边也合并,下一次遇到儿子数 \(\leq 1\) 点直接略过即可。

GOLD - C - Exercise G

  • \(n\) 的排列中,可能出现的构成的多个简单环的环长的 \(\text{lcm}\) 的和。
  • \(n\leq 10^4\)

每个质数可以单独考虑,用 \(f(i,j)\) 表示前 \(i\) 个质数当前和为 \(j\) 的不同 \(\text{lcm}\) 的和。

注意到即使最终和 \(<n\) 也可以用自环补齐,然后转移实际上是个背包,于是 \(O(n^2)\) 解决了。

Platinum - A - Sprinklers 2: Return of the Alfalfa P

  • \(n\times n\) 的格子中放置喷洒器,一种朝右上一种朝左下,一个格子需要且只能被一种喷洒器覆盖到。
  • 有些格子不能放置喷洒器,求方案数。
  • \(n\leq 2000\)

实际上就是列的大小对某一种来说是单调的,并且转折点必须有另一种存在,根据这个就可以直接 \(O(n^2)\) DP。

简单写写发现还要记录 \(0/1\),都是实现上的小细节。

Platinum - B - Exercise P

  • 求所有 \(n\) 的排列构成的置换环的长度的 \(\text{lcm}\) 的乘积。
  • \(n\leq 7500\)

综合性很强的数数题,设 \(\mathcal F(x)\) 表示 $ x|\text{lcm}$ 的方案数,那么答案就是:

\[\displaystyle \prod_{p,c} p^{\mathcal F(p^c)} \]

对同一质数的每个质数计数是经典套路了。

考虑容斥一次,设 \(f(i)\) 表示都不是 \(x\) 的倍数的,总环长为 \(i\) 的方案数,那么 \(\mathcal F(x)=n!-f(n)\)

在递推的时候再容斥一次,设 \(g(i)\) 表示长度和为 \(i\) 的环,全都是 \(x\) 的倍数的方案数,则:

\[\displaystyle f(i) = i! - \sum _{x|j,j\leq i} \binom{i}{j} g(j)\times f(i-j) \]

对于 \(g\) 的转移,考虑钦定第一个点为关键点,枚举第一个点所在的环长:

\[\displaystyle g(i)=\sum_{x|j,j\leq i} \binom{i-1}{j-1}\frac{j!}{j}g(i-j) \]

复杂度是 \(O(\displaystyle \sum_{x=p^c} \frac{n^2}{x^2})\),也就是 \(O(n^2)\) 了。

注意对指数的计算需要 \(\bmod \varphi(P)=P-1\),实际上做法也不基于模数是指数,只是求 \(\varphi\) 方便点。

Platinum - C - Circus P

  • 给定 \(n\) 个点的树,对于一个局面,有 \(k\) 只牛被放在 \(k\) 个不同的树上节点上。
  • 一只牛可以移动到一个相邻且不被占据的节点上,两个局面可以经过任意次移动互相到达,则成为等价局面。
  • 对每个 \(k\in[1,n]\),求等价类个数。
  • \(n\leq 10^5\)

我不理解。

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