Loading [MathJax]/jax/element/mml/optable/MathOperators.js

CodeForces 思维题选做

我说是思维题那就肯定不是思维题。


CF1292B Aroma's Search 大意是给一堆有规律的点和起始坐标求最大能经过的点数,反正是一个简单的贪心策略,现在大致证明一下:对于 1pLimit 都有先往小的方向走再往大的方向走。

首先往小的方向走显然是正确的贪心策略,对于一个坐标集 xi=ax×xi1+bx, yi=ay×yi1+by 分布巨大多显然是从稠密到稀疏,所以往稠密的部分走没什么毛病。

直到这里还没什么问题,因为如果走到头了,也就是走到 (x0,y0) 时间不够了直接停止,那后面的时间呢?为什么回头走还最优啊?

这里直接暴力计算一下,(xi,yi)(xi1,yi1) 显然路程为 xi+yixi1yi1,因为有单调性。那么就有 (xi,yi)(x0,y0) 路程为

ij=1xj+yjxj1yj1=xi+yix0y0

然后显然有 (xi,yi)(xi+1,yi+1)=(xi+1+yi+1xiyi),把题目中的条件代进去就是
ax×xi+bx+ay×yi+byxiyi
=(ax1)xi+(ay1)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

求因数个数,根据唯一分解定理,对于正整数 xans=\prod\limits_{i=1}^n(p_i+1),其中 p_i 表示 x 的第 i 个质因子的指数。考虑从这个意义上枚举质因子,最后算乘积就好了。

但是,由于询问次数不能超过 22,考虑对询问的过程进行优化。


  1. 怎么快速得到某个质因子的指数?

朴素做法显然是把每一个可能的指数询问一遍。但是想想就知道,对于一个确定存在的质因子 P,不如直接用 P^k 去询问 \gcd:这里的 k 表示第一个满足 P^k\ge x_{\max} 的正整数。同时,这里的 x_{\max} 直接设为上界 10^9 即可,询问 Q=P^k 就可以快速得到它的指数。

  1. 怎么快速得到 “ 确定存在的质因子 P ”?

由于允许的询问数量极小,所以考虑批量询问。由于Q \space (1 \le Q \le 10^{18}),想到把一串质数压成一个大数进行询问,这样就可以得到存在的质因子:从而可以通过 1 中做法进行处理。

  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=1ans=2:剩下的数最多由三个质数相乘得到,最终答案最少为 1 \times 1 = 1,最多为 2 \times 2^3=16,输出 8 可以折中。
  • 如果当前答案不为 12:考虑最坏情况,当前答案为 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

按位考虑,考虑进位情况以及每一位最后的奇偶性。

posted @   MistZero  阅读(127)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示