CodeForces 思维题选做

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


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

首先往小的方向走显然是正确的贪心策略,对于一个坐标集 \(x_i=a_x \times x_{i-1} + b_x, \space y_i = a_y \times y_{i-1} + b_y\) 分布巨大多显然是从稠密到稀疏,所以往稠密的部分走没什么毛病。

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

这里直接暴力计算一下,\((x_i,y_i) \rightarrow (x_{i-1},y_{i-1})\) 显然路程为 \(x_i+y_i-x_{i-1}-y_{i-1}\),因为有单调性。那么就有 \((x_i,y_i) \rightarrow (x_0,y_0)\) 路程为

\[\sum\limits_{j=1}^{i}x_j+y_j-x_{j-1}-y_{j-1}=x_i+y_i-x_0-y_0 \]

然后显然有 \((x_{i},y_{i}) \rightarrow (x_{i+1},y_{i+1})=(x_{i+1}+y_{i+1}-x_i-y_i)\),把题目中的条件代进去就是
\(a_x \times x_i + b_x + a_y \times y_i + b_y-x_i-y_i\)
\(=(a_x-1)x_i+(a_y-1)y_i+b_x+b_y\)

\(\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\),考虑对询问的过程进行优化。


  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=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\)

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

posted @ 2021-10-12 10:08  MistZero  阅读(119)  评论(0编辑  收藏  举报