7.2——907D
907 D
复健后第一次每日一题(day1)。打表看半天没啥想法,后来看题解才发现是暴力。
\[g(x) = \lfloor\frac{log_{2}x}{log_{2}(\lfloor log_{2}x\rfloor)}\rfloor
\]
观察 \(g(x)\) 的表达式并通过打表可以察觉到,\(g(x)\) 总是在若干个连续段内取相同的值。可以大胆猜想分段数不会很多,以至于可以暴力二分查找每段的分段点,事实上也的确如此。
可以利用分母中的 \(\lfloor log_{2}x \rfloor\) 进行分段:\(\lfloor log_{2}x \rfloor\) 的取值数量最多 \(60\) 个,并且在每一段内,\(g(x)\) 是单调不减的,可以在每一段内二分来求段内的分段点。由于整个分母的大小不会超过 \(5\),因此可以证明 \(g(x)\) 在某个 \(f(x)\) 对应的段内发生的变化不会超过 \(1\),因此一个段内只会有 \(0或1\) 个分段点。
利用前缀和思想求得 \(cal(r) - cal(l-1)\) 即为答案,总复杂度为 \(O(qlog^{3}n)\)(共分为 \(logn\) 段,每段需要一次二分,且 \(check\) 函数检验是 \(O(logn)\) 的。但是这样的做法会 \(TLE\),因为 \(log\) 太多了。其实这里的二分是没有必要的,可以利用数学式直接 \(O(1)\) 来求分段点,这样就优化成了 \(O(qlog^{2}n)\)。具体细节见代码。