把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

P10204 [湖北省选模拟 2024] 白草净华

题面传送门

哎呦,我感觉这个题太深刻了。

首先我们假设我们现在知道 \(n\),怎么找到最大值。知道 \(n\) 意味着我们可以任意跳,而不需要在上一次的基础上跳。考虑 \(a_0\)\(a_1\) 的大小关系,不妨假设 \(a_0<a_1\),则整个图的形状是先一段上升,再一段下降,再一段上升。我们考虑二分出一个位置,满足这个位置左边的都 \(\geq a_0\),右边的都 \(<a_0\),容易发现这是可以满足的,然后 \(0\) 到这个位置之间就是单峰的,可以三分或者二分斜率,总之可以做到 1log。

然后现在我们不知道 \(n\),注意到,如果对于一对 \(x,y\),满足 \((a_x,a_{x+1})=(a_y,a_{y+1})\),则 \(n\mid y-x\)。因此我们不妨采用 22 年 ICPC 杭州站的思路进行 BSGS,将步长设做 \(\sqrt {2n}\) 可以得到一个 \(2\sqrt {2n}\) 步数的做法,可以进 \(3333\) 的限制。

然后我们发现,这个题相对于杭州站那个题的优势在于它是有特殊性质的,我们考虑利用这个特殊性质。首先,对于三个位置 \(x,y,z\),若我们知道了 \(a_x,a_{x+1}\) 以及剩下两对的值,我们是可以判断其在环上的方向的,这个分讨就可以判断是 \(1\to 2\to 3\to 1\) 还是 \(1\to 3\to 2\to 1\)

我们考虑倍增,初始化 \(x=0,y=1,z=2\),每次将 \(y,z\) 都乘上 \(2\),如果其仍然满足 \(x\to y\to z\to x\) 的顺序说明 \(n\)\(z\) 大,否则说明在 \([y,z]\) 范围内。

然后在这个范围内二分,需要解决的是指针只能往后走的问题。发现我们只需要关心指针之间的相对位置而不关心绝对位置,因此我们可以将第一个指针移到上一次询问的位置,将剩下两个指针按照相同的偏移量移动,这样子就可以进行新的询问了。

需要注意的是虽然相邻没有相同的数,但是上下两端会有,需要特别注意一下,这个做法大概是 \(7\log n\) 次询问。

但是还没有结束!题解区有老哥给出了更优的做法:

随机 \(m\) 个点,枚举 \(n\),check 这 \(m\) 个点 \(\bmod n\) 之后是否构成单峰。感性理解一下相邻两个点的大小关心是随机的,因此期望 \(m=O(\log n)\) 之后就能确定这个 \(n\)!后面一部分按照上面的方法做就行,听说能进 \(100\) 次询问。感觉太深刻了!

submission

posted @ 2024-02-28 15:50  275307894a  阅读(159)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end