CodeForces 思维题选做
我说是思维题那就肯定不是思维题。
CF1292B Aroma's Search 大意是给一堆有规律的点和起始坐标求最大能经过的点数,反正是一个简单的贪心策略,现在大致证明一下:对于 ∀1≤p≤Limit 都有先往小的方向走再往大的方向走。
首先往小的方向走显然是正确的贪心策略,对于一个坐标集 xi=ax×xi−1+bx, yi=ay×yi−1+by 分布巨大多显然是从稠密到稀疏,所以往稠密的部分走没什么毛病。
直到这里还没什么问题,因为如果走到头了,也就是走到 (x0,y0) 时间不够了直接停止,那后面的时间呢?为什么回头走还最优啊?
这里直接暴力计算一下,(xi,yi)→(xi−1,yi−1) 显然路程为 xi+yi−xi−1−yi−1,因为有单调性。那么就有 (xi,yi)→(x0,y0) 路程为
然后显然有 (xi,yi)→(xi+1,yi+1)=(xi+1+yi+1−xi−yi),把题目中的条件代进去就是
ax×xi+bx+ay×yi+by−xi−yi
=(ax−1)xi+(ay−1)yi+bx+by
\because a_x \ge 2, \space a_y \ge 2,\space b_x \ge 0,\space b_y \ge 0\space \therefore (x_{i},y_{i})\rightarrow (x_{i+1},y_{i+1}) \ge x_i+y_i
同理有 (x_i,y_i) \rightarrow (x_0,y_0) \le x_i+y_i
那么显然有 (x_i,y_i)\rightarrow(x_0,y_0) \le (x_i,y_i)\rightarrow(x_{i+1},y_{i+1})
然后就出来了走左边更优,你这时走回去也就是两倍的路程而已,先走左边全部的甚至比往右边走一步还要优。所以就是这么简单,我可能写复杂了。
CF1304C Air Conditioner 每一分钟可以让温度 \pm1,求是否能满足每一时刻正好在某一区间内。
巨大多简单题,每一次求出可能的目标区间然后判断即可,注意求线段交可以用 min, max
。
CF1355F Guess Divisors Count 对于一个正整数 x \space (1 \le x \le 10^9) 的因数个数,每一次可以询问一个正整数 Q \space (1 \le Q \le 10^{18}),交互库会返回 \gcd(x,Q)。最多可以询问 22 次。最后需要你给出这个数的因数个数,若你给出的 ans 与精确答案 d 满足以下两个条件中的任意一个则视为正确。
- |ans-d| \le 7
- \dfrac{1}{2} \le \dfrac{ans}{d} \le 2
求因数个数,根据唯一分解定理,对于正整数 x 有 ans=\prod\limits_{i=1}^n(p_i+1),其中 p_i 表示 x 的第 i 个质因子的指数。考虑从这个意义上枚举质因子,最后算乘积就好了。
但是,由于询问次数不能超过 22,考虑对询问的过程进行优化。
- 怎么快速得到某个质因子的指数?
朴素做法显然是把每一个可能的指数询问一遍。但是想想就知道,对于一个确定存在的质因子 P,不如直接用 P^k 去询问 \gcd:这里的 k 表示第一个满足 P^k\ge x_{\max} 的正整数。同时,这里的 x_{\max} 直接设为上界 10^9 即可,询问 Q=P^k 就可以快速得到它的指数。
- 怎么快速得到 “ 确定存在的质因子 P ”?
由于允许的询问数量极小,所以考虑批量询问。由于Q \space (1 \le Q \le 10^{18}),想到把一串质数压成一个大数进行询问,这样就可以得到存在的质因子:从而可以通过 1 中做法进行处理。
- 但是即使是这样优化了也跑不进 22 次啊?
还没完呢!由于这道题需要给出模糊答案,我们就可以进行模糊的处理。
先前的过程中,每一次询问完压成的大数的段,我们都可以发现,如果当前剩余的 \dfrac{x_{\max}}{\prod P} 小于这一段后第一个数(不妨设为 g,当前得到的答案为 ans)的立方,即 g^3,此时的因数个数一定会被控制在 [ans,(3+1)ans],即 [ans,4ans] 间,因为 g^3 对于答案的贡献为 4,而最坏情况为当前剩余的数无法产生新的贡献(即为 1),所以折中输出 2ans,必定正确。
处理完后,我们发现,还没有用上差不超过 7 的条件。
所以考虑设置一个阈值使得答案可以通过特判得到。
由于上述处理时,立方可以保证 \dfrac{1}{2}d \le ans \le 2d,得到阈值范围在三次方根内。
充分发扬人类智慧发现这种方法取到 700 左右可以通过,下面分两种情况讨论。
- 如果当前 ans=1 或 ans=2:剩下的数最多由三个质数相乘得到,最终答案最少为 1 \times 1 = 1,最多为 2 \times 2^3=16,输出 8 可以折中。
- 如果当前答案不为 1 或 2:考虑最坏情况,当前答案为 3,前面取到 2^2=4。此时剩余的数最多为 2.5 \times 10^8。发现无法承受立方级别的新增质因子积(由于值域为 700 左右往上),所以最多为平方级别的贡献。此时答案最少为 ans,最多为 (1+1)^2ans=4ans。折中为 2ans 即可。
这题就做完了,实现细节有点多。
CF1313D Happy New Year
每一个区间可以选或不选,选的区间贡献都 +1。
现在要求序列中最大的可能奇数个数。
根本不会,希望之后能看懂。
我之前是什么谜语人。
CF1322B Present 求 \bigoplus_{i=1}^{n}\bigoplus_{j=i+1}^{n}(a_i+a_j),n \le 4 \times 10^5。
按位考虑,考虑进位情况以及每一位最后的奇偶性。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步