U721597/T810485 牛來 解題報告
我出的第一道 adhoc,可能質量不是很好。
題意已經非常清晰明了了,這裡直接講思路。
首先研究一下 \(\frac{sin(cx)}{cx}\) 的形态,大致长这样:

然后我们的目标其实比较明确:先找到正半轴上第一个 \(f(x) \le 0\) 的点 \(x_0\),然后在 \((0, x_0]\) 上进行二分找到第一个零点就好了。
我会倍增!
因为 \(c\) 其实是有一个上界 \(U\) 的,在这里我们让 \(U_0 = 10^9\)。这样,我们一定有 \(x_0 \ge \frac{\pi}{U_0}\)。因此,我们从 \(\frac{\pi}{U_0}\) 开始往后倍增跳,具体过程如下:令 \(x_0 = \frac{\pi}{U_0}\),然后每次查询 \(f(x_0)\),如果 \(f(x_0) > 0\),那么 \(x_0 \leftarrow 2x_0\) 继续查询,否则我们就找到所需了。
这个过程显然由 \(c\) 的范围直接决定,差不多要使用 \(\mathcal{O}(\log V)\) 次查询。
然后找到之后,直接二分就可以了,你还需要差不多 \(20\) 次查询。这样你可以拿到 \(60\) 分。
但是注意到 \(60 < 100\),有没有更强力的算法呢?
我会随机化!
考虑到想要确定性比较难,直接在这基础上引入随机化的算法。
具体的思考过程是:我们观察到,当 \(x\) 很大时,\(f(x)\) 会很小,这其实可以写成一个不等式:\(|f(x)| = g(x)\cdot\frac{|\sin(cx)|}{cx} \le \frac{2}{cx}\)。
然后我们发现这玩意其实可以作为 \(c\) 的上界:\(U_1 = \frac{2}{x\,|f(x)|} \ge c\)。
然后我们显然可以发现,\(U_1 <<< U_0\) ,\(\frac{U}{c} = \frac{2}{g(x)\,|\sin(cx)|}\)。
因为 \(g(x) \ge 1\),所以只要 \(|\sin(cx)| \ge \frac12\),就有 \(U/c \le 4\)。
一个周期内 \(|\sin \theta| \ge \frac12\) 恰好占 \(\frac23\) 的长度,所以:
所以多随机几次询问的相位即可。取到 \(U\) 最大的那个然后接着倍增就行了,倍增次数大幅降低。
这时,期望查询次数来到了 \(25\) 次左右,可以通过。
我会数学!
其实添加 \(g(x)\) 扰动就是为了卡掉数学做法。在没有这个扰动的情况下,直接查询 \(f(x)\) 和 \(f(2x)\) 然后推式子就好了,可以 \(2\) 次查询完成。

浙公网安备 33010602011771号