*1900 ~ *2100 做题记录

2148G - Farmer John’s Last Wish *1900

转化题意,设一个前缀的 gcd 为 ,要选尽可能多的数使得这些数的 gcd 不为

遍历前缀,当从 时,分三种情况讨论:

  • 在选取的数中,此时这些数的 gcd 一定为 的约数,开一个桶,枚举取 max 即可。
  • 不在选取的数中,继承 的答案。
  • 不在选取的数中,且 全被选,判断一下 gcd 的关系即可,若合法答案即为

时间复杂度

1510D - Digits *2100

这有 *2100?直接 dp 存不下最大乘积,但是你取个 log 就能过了(python 可能也能过)。

正解好像是先判掉 的情况,然后末位为 的数字就不能选了。

有个结论是剩下的数中最多只有三个数不会被选,分 的奇偶性讨论一下就行。从而对这 个数 dp 即可,时间复杂度

1665D - GCD Guess *2000

询问 相当于得知 ,据此固定 而改变 即可得知 与某个常数的 。根据询问次数不超过 的提示,我们考虑逐位确定 的值(因为 ,求 会更加方便)。

首先我们可以发现询问 可得知 的奇偶性,假设我们已经知道了 的后 位对应的值为 ,那么判断第 位是否为 1 只需判断 是否是 的倍数,如此即可逐位求出 的值,且询问次数 次。

549D - Haar Features *1900

每次找最右下角的系数不为 的格子,将其系数变为 即可,复杂度

倒序遍历可以省去找格子的时间,再使用二维树状数组可以将时间复杂度优化至

考虑这样为什么是对的,取最优方案,你会发现这个过程刚好能够覆盖到最优方案的所有操作点,于是正确性显然。

940E - Cashback *2000

这有 *2000?首先选出来的区间长度肯定为 的倍数(不然最小值会更小),其次选一个长度为 的不如选两个长度为 的,于是直接 dp 就行,转移只可能从 转移来,用单调队列或者 st 表优化区间最值即可,复杂度

484B - Maximum Value *2100

貌似写了个非常规做法,但是 咋还得卡常啊。

熟知 ,对 数论分块,每次只需要查询值域在 内的最小值即可最大化答案,加了点剪枝( 的初始值设为 )就能过。

有点唐了,把数论分块换成去重后枚举 就是均摊 的,调和级数都忘了。

557D - Vitaly and Cycle *2000

先二分图染色,不能染的已经含有奇环,然后把加三条边和两条边的特殊情况判掉。

考虑一个连通的二分图,想要让其含有奇环即把其变为非二分图,于是连接两个黑点或两个白点即可,总时间复杂度

2044F - Easy Demon Problem *1900

即求是否存在 满足 ,由于 ,直接枚举 的约数,开个桶判断即可,时间复杂度