Codeforces Round 962 (Div. 3) D. Fun 题解
写在前面的话
想了一个小时,第一次写这种题,也算是学到了。可惜这个题本来不难的,没有写出来。但是觉得特别好,于是记下,希望对我和大家都有帮助!
题意
给你两个不等式:
给出 \(x , n\) 要求出符合不等式组的三元组\((a , b, c)\) , 其中$(1 , 2 , 1) , (1 , 1 , 2) $不被认为是同一组解。
约束: 对于T组测试点满足 , \(1 \leq \sum_{i=1}^{T}x_i , \sum_{i=1}^{T}n_i \leq 10 ^ 6\)
思路
观察不等式 , 我们可以发现因为\(a \ast c + a \ast b + b \ast c\)这种特殊结构 , 所以\((1 , 2 , 1), (1 , 1 , 2)\) 结果相同 , 它们等价。
观察数据范围 ,\(10 ^ 6\) 大概率是 \(O(n)\) 到 \(O(nlogn)\) 的做法合理.
观察到 \(3 \leq a + b + c \leq x\) 这也是一个性质 , 但是貌似和解题没什么关系。
观察到 , 如果\(a \ast b + a \ast c + b \ast c \leq n\) 成立 ,那么 \(a \ast b \leq n\) 也一定成立。假设我们现在枚举 a , 然后看看最多有多少合法的 b。
结论:
- 对于\(\forall a\) 最多有 \(O(logn)\) b 成立
那么我们只需要暴力枚举 a , b 即可 , 如果发现不等式不满足 ,直接放弃更大b的枚举。——因为两个不等式左边是单调的。
将不等式变形 , 所以答案是
因为C 最小取 1 , 我们只需要找到满足两个等式的C最大取多少。将所有的\(a , b\) 都枚举完 , 统计贡献即可。
时间复杂度证明
首先我们试着找到 b 最多枚举多少个 , 由上 \(a \ast b \leq n\)
我们知道 b 最多枚举 这么多 , 但是这不够显然!
我们可以尝试先暴力 , 枚举 a , b.
那么我们可以得到答案为以下等式:
Note: 为了保证取到最多的b使得上式尽量成立 , 我们取 \(C := C_{min}\) 即 1。
我们可以通过放缩得到下式:
对于右边的等式我们发现是一个调和级数 对于\(\forall a\), 我们最多可以取到\(O(logn)\)个b , 所以最后的时间复杂度是
\(O(nlogn)\)的。
至此,证毕!
后文
如有任何错误和建议,请在评论区指出!

浙公网安备 33010602011771号