本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2025-03-20 16:16:53
Training Link: https://codeforces.com/contests/596860
本场难度最高的是 E 题,除此以外思考时间不需要超过半分钟。
A
题意
给定两个数 $a,b$。
每次给定一个区间 $[l,r]$,求区间内 $a,b$ 的最大公因数 。
Solution
升序预处理 $a,b$ 的所有公因数,每次询问二分求出最大的。
B
题意
有两种计数方法。
一种以 $1,2,3,\cdots$ 的形式。
另一种以 A 开始,一直到 Z,然后再到 AA,AZ,BA,BZ,一直到 ZZ,然后到 AAA,以此类推。
要求写一个程序将编号从两种形式之间互相转化。
Solution
考虑数字形式转化为字母形式,当前数字是 $x$。
首先枚举长度,首先从 $x$ 中减去长度比自己小的数量。
然后,从高到低计算每一位的值,从 $x$ 中减去这一位小于自己的数量。
一直到 $x$ 减到 $0$。
反过来,字母形式转化为数字形式也差不多,不过简单很多。
C
题意
做一个汉堡需要 $3$ 种材料,分别 $a,b,c$ 个。
给定你已经有的材料,每种材料的价格,你的钱数,求最多做多少个汉堡。
Solution
二分,或者不嫌麻烦的话,$O(1)$ 分段函数也可以。
D
题意
你可以进行任意数量的操作,每次可以在 $[1,k]$ 选择一个整数加上去,且必须至少有一次操作加的值大于等于 $d$,求最后操作结果为 $n$ 的方案数。
Solution
$dp_{i,j,0/1}$ 代表前 $i$ 个,总和为 $j$,是否已经有一个位置的值大于等于 $d$ 的方案数。
E
题意
给定 $n$,要求选择 $3$ 个不一定不同的小于等于 $n$ 的数,要求 $lcm(1,2,3)$ 最大。
题解
考虑一些贪心的方案。
比如选择 $n,n-1,n-2$,分情况讨论的结果:
如果 $n$ 是奇数,那么就是 $n(n-1)(n-2)$。
但是如果 $n$ 是偶数,那么 $(n,n-2)=2$,此时结果是 $\frac{n(n-1)(n-2)}{2}$。
考虑转化一下,选择 $(n-1)(n-2)(n-3)$,那么答案就是 $(n-1)(n-2)(n-3)$。
这样成功获得了答案的一个较大的上界。
由此可得,只需要将 $3$ 个数在 $[n-3,n]$ 之间枚举,就可以保证不出错。
上述已经可以解决本题,想要更快的速度,只需要再分讨一种 $n,n-1,n-3$ 的情况就可以了,这样凑齐了全部的可能情况。
F
题意
给定一个 $n\times m$ 的网格图,由空单元和障碍组成,保证空单元是联通的。
要求将恰好 $k$ 个空单元变为障碍,使得所有的剩余空单元仍然联通,要求构造出一组方案。
Solution
将所有的空单元建立一颗 dfs 生成树,每次只删除叶子节点就可以了。
G
题意
有 $n$ 个箱子,每个箱子有 $a_i$ 个物品。
单次操作可以选择一个箱子 $x$,满足 $2x+1 \le n$,从箱子 $x,2x,2x+1$ 各取出一个物品,如果没有物品则不取出。
求最少操作次数清空所有箱子。
Solution
显然是一颗完全二叉树。
如果存在一个节点,使得仅有一颗子树,那么其必然无法完成操作,这是因为这种节点只能出现在倒数第二层。
$dp_{u,i}$ 代表 $u$ 为根的子树,$u$ 自己还剩 $i$ 个,子树全部清空的最小代价。
转移是显然的。
最后,$ans = min(dp_{1,i}+i)$,但是注意如果 $n=1$ 那么无解。
H
题意
给定一个文件路径,要求对其简化,简化方法是将多个连续的 \/ 转化为 $1$ 个 \/,最后一段 \/ 全部删除(但是需要保证不会删空)。
Solution
扫一遍,只将每一段第一个 \/ 加入答案,最后将最后一段 \/ 全部弹出。
然后输出。
I
题意
有 $n$ 个本质相同的步兵,$m$ 个本质相同的骑兵,要求对其进行排列,要求不能有超过 $k1$ 个连续步兵,超过 $k2$ 个连续骑兵,求方案数。
Solution
$f_{i,j,k,l}$ 分别代表已分配步兵数量,已分配骑兵数量,当前连续步兵数量,当前连续骑兵数量。
升序枚举 $4$ 个量,正常转移就没问题。
J
题意
给定一个字符串 $s$,求最长的子串,使得其既是 $s$ 的前缀,又是 $s$ 的后缀,又在 $s$ 中间出现过。
Solution
枚举前缀,通过哈希判定对应后缀是否与自己相同。
现在需要求出的是最长的中间字符串使得其等于某个前缀。
容易发现这就是第 $2$ 到 $n-2$ 个非空前缀的 border 最大值。
使用 kmp 计算出每个位置的 border 值取最大的,到这里其实可以发现前缀与后缀的相等判定也不再需要,只需要枚举整个字符串的每个 border 长度作为前后缀就可以了。
K
题意
给定一个长度为 $n$ 的可能存在负数的整数数组。
求将其划分为 $3$ 个和相等的子数组的方案数。
Solution
计算出单个数组的和 $avg$,定义一段子数组合法当且仅当其和等于 $avg$。
先枚举第一段,使得第一段合法。
然后,问题转化为对于每个后缀,求出其划分为两个合法数组的方案数。
注意到一个性质,只需要第一个子数组合法了,剩下的那个一定也合法。
一段区间 $[l,r]$ 合法判定条件为 $p_r-p_{l-1}=x$。
考虑从 $n$ 倒序枚举后缀的起点,记当前起点为 $l$,那么当前后缀的答案就是满足 $p_r=x+p_{l-1}$ 的 $r$ 的数量,开个 map 记一下每个 $p$ 值的数量就行了。
L
题意
原题意太烦人了,就写点核心操作要干的事:
给定 $x$,求 $floor(0.8x),ceil(0.8x),floor(\frac{x}{0.8}),ceil(\frac{x}{0.8})$。
Solution
不要使用 double 不然容易被 hackers 干死。
考虑乘法下取整,将其转化为乘 $8$ 再除以 $10$,此时,如果原本结果就是整数,那么不会有问题,否则显然结果就是下取整的。
考虑除法,可以转化为乘法。
M
题意
给定一个 $n$ 个点的树,每条边标记了一个方向,代表这条边的指向。
需要确定一个点作为首都,随后有一个任务,需要到达树的所有节点(到达之后跳回首都),但只能沿着指向的方向走。
求有多少个点作为首都时,需要改变指向的边最少。
Solution
先以 $1$ 作为根(不一定是首都)。
然后,假设 $x$ 点是首都,那么答案就是除了 $x$ 到根路径以外所有的向上边,以及 $x$ 到根路径上所有的向下边。
这些都可以一次预处理的出来。
N
题意
有 $n$ 个物品,每个物品有对应价值,给定背包容量,求最多选多少个。
Solution
$f_{i,j}$ 代表前 $i$ 个总共用了 $j$ 的容量,求最多选了多少个物品数量。
O
题意
有一个长度为 $2^n$ 的数列。
第一次操作将相邻两项变为其 OR 值然后合并。
第二部将相邻两项变为其 XOR 值然后合并。
第一次操作将相邻两项变为其 OR 值然后合并。
就这样 OR,XOR 交替,操作 $n$ 次。
每次询问修改一个位置的值,回答修改之后,这个数列最终剩余的数的值。
Solution
注意到本题单点修改,支持 $O(1)$ 合并两个子树的答案。
建立一颗线段树维护就可以了。
P
题意
有一个 $n\times m$ 的网格图。
单次跳跃可以横向或纵向跳恰好 $s$ 单位,求有多少个位置可以跳到最多的位置。
Solution
横纵分开考虑,以下仅考虑横向最多位置。
注意到前 $1+(n-1)\bmod s$ 个位置可以跳到尽可能多的位置。
然后,自然地,一个可行地位置加上 $s$ 仍然是可行的。
所以答案就是 $\lfloor \frac{n}{s}\rfloor (1+(n-1)\bmod s)$。
纵向同样方式计算,答案乘起来就行。
Q
题意
给定 $l,r$,求 $\forall l\le a\le b\le r$,最大的 $a\oplus b$。
Solution
首先,忽略掉 $l,r$ 的二进制表示下的公共前缀。
假设确定了答案的最高位为 $i$,那么两个数必然一个是 $2^i$,一个是 $2^i-1$。
R
题意
给定一张图,保证其为一条链,输出它。
Solution
随便选一个点,如果度数为 $1$,那么一直走下去就可以。
如果度数为 $2$,那么两个出点分别 dfs 就行。
S
题意
给定 $a,b$,满足 $a\ge b$,求 $\frac{a!}{b!}$ 的质因数个数。
Solution
注意到乘法过程中,质因数个数会相加,除法则相减。
线性筛预处理每个数的质因数个数,剩下的事就非常简单了。
T
题意
给定一个整数数组 $a$,值域 $[1,10^7]$。
令 $f(x)$ 代表 $a$ 中能整除 $x$ 的数的个数。
多次询问,每次给定一个区间 $[l,r]$,令 $S$ 代表 $[l,r]$ 的质数集合,求 $\sum\limits_{v\in S} f(v)$。
$1 \le l \le r \le 10^9$。
Solution
线性筛预处理出所有数的质因数,然后,预处理每个质数的贡献,前缀和计算答案。
U
题意
一个 01 串合法当且仅当可以通过【将连续 $k$ 个 $1$ 变为 $0$】 的操作将所有数变为 $0$。
多次询问,每次询问 $[l,r]$,求长度在 $[l,r]$ 之内的 01 串个数。
Solution
$f_{i,0/1}$ 代表长度为 $i$,最后一个数是 $0/1$ 的方案数,转移显然,前缀和预处理一下就可以 $O(1)$ 算答案。