题
有一个匀速运动的点,初始位置和速度均属于 \([0,10^6]\)。
每次询问一个坐标,返回点在坐标左边还是右边,\(200\) 确定位置。
题解:
有 \(10^12\) 种不同的直线,然后每次近似找到比较中间的位置然后排除一半,询问复杂度 \(O(2\log v)\)。
然后如何找到近似位置呢,直接二分答案,可能的所有 \(v\) 对应的 \(p\) 是一段区间。
然后直接做就做完了??时间复杂度 \(O(v\cdot\log^2 v)\),有点危险。
我们考虑找到 \(\left\lfloor\frac{p+v\cdot t}{t}\right\rfloor\) 和 \((p+v\cdot t)\bmod t\) 可以确定比较中间的点。
然后发现两个东西值域都是 \(v\),所以直接可以暴力遍历值域,复杂度是 \(v\cdots \log v\)。
题
\(n\times n\) 的格子,每个格子内一个数。
除了最大的格子,其他所有格子周围都有一个格子比他大。
找到最大格子。
题解:
直接二分,具有单调性。
题
字符集为 \(4\),第一个字符仅出现一次。
每次问一个长度不超过 \(4n\) 的字符串,返回最长前缀在询问字符串中出现的长度。
问 \(n+2\) 次确定字符串。
题解:
第一个 \(2\) 次确定,最后一个 \(2\) 次确定。
每次 s+a||s+ba||s+bb||s+bc
返回 0->c,1->a,2->b
可以 \(1\) 次确定。
刚好 \(n+2\) 次询问。
题
有一个 \(01\) 串,知道 \(1\) 的个数奇偶性。
每次问两个下标集合,如果 \(1\) 的个数不等,<
返回 0
,>
返回 1
,否则返回任意一个。
用 \(O(n)\) 算出来 \(01\) 串。
题解:
首先,本质上来说是按策略返回 \(S\ge T\) 或 \(S\le T\)。
全局最大的那个肯定是 \(1\),我们可以 \(2n\) 次找到 \(1\)。
每次可以查询 \(a+b\le 1\) 或 \(a+b\ge 1\),这样 \(a,b\) 肯定有一个 \(0\) 或肯定有一个 \(1\)。
然后判断一下 \(a,b\) 大小,就肯定能确定一个 \(0\) 或 \(1\)。
每次迭代规模减半,最后一个通过 \(1\) 奇偶性即可。
复杂度 \(7n+C\)。
优化:
发现找 \(1\) 有点累赘,考虑比较 \(a+b\) 和 \(c\)。
然后 \(a+b\le c\) 时显然 \(a,b\) 有一个 \(0\),可以 \(5n\)。
\(a+b\ge c\) 时是有问题的,我们可以得到 \(a,b\) 中较大的比 \(c\) 大。
于是我通过 \(5n\) 的代价得到了一些确定的 \(0\) 和一条单调的链。
要求它是单调链的话直接每次把链底最后一个拿出来比较。
不全零,所以最后一个肯定是 \(1\)。
二分找到分界点,比较相邻两个数和和 \(1\) 来继续二分。
然后就全部都确定了。