Codeforces Round #705 (Div.2)
A. Anti-knapsack
选出 $\geqslant \lceil k/2\rceil$ 且 $\neq k$ 的所有数即可。
证明:$>k$ 的所有数一定是都可以选的,所以我们关注点主要放在 $1\sim k-1$ 这些数上。首先,容易知道选出 $\geqslant \lceil k/2\rceil$ 的数一定是满足题意的;其次,两两配对,容易知道最多从这 $k-1$ 个数中选出 $\lfloor k/2\rfloor$ 个数;因而我们的方案是最优解。证毕。
1 | #include<bits/stdc++.h> |
B. Planet Lapituletti
遍历所有的时间,判断是否合法即可。
1 | #include<bits/stdc++.h> |
C. K-beautiful Strings
如果 $k\nmid n$,那答案不存在;否则答案一定存在,因为 $zz\ldots z$ 是满足题意的一个 beautiful string。
如果 $s$ 本身是 beautiful 的,那么答案就是 $s$;否则,答案一定是从某一位开始与 $s$ 不一样的。枚举这个位置 $\text{pos}$ 以及该位置上的字母(从大于 $s_\text{pos}$ 的字符开始枚举),计算之前出现过的字母还需要出现多少次才能被 $k$ 整除,由于 $\text{pos}$ 处已经保证答案的字典序比 $s$ 大了,所以我们只需要把还差的字母按字典序依次填在 $\text{pos}$ 之后,如果还有剩余的位置,那就补字符 a
。
1 | #include<bits/stdc++.h> |
D. GCD of an Array
对 $[1,200000]$ 中的每一个质数维护一个数据结构,能够完成对第 $i$ 个数加 $x$ 、求 $1\sim n$ 的最小值的操作。由于每个数最多有 $6$ 个不同的质因子,每次询问做单点加法的位置很有限,或者说,整个 $n\times P$ 的矩阵是很稀疏的,我们可以用一些 $\text{STL}$ 完成。比如我是对每一个质数开一个 unordered_map
和 multiset
完成的。
注意一个 trick:求 $\gcd$ 时需要作除法,为了避免每次做除法都求逆元耗时过大,可以先把要除的数乘起来,最后求一次逆元就行了。
1 | #include<bits/stdc++.h> |
Codeforces Round #705 (Div.2)
http://xyfjason.github.io/blog-xcpc/2021/03/07/Codeforces-Round-705-Div-2/