很久没有写博客了,还是写一篇吧。
Problem
插入一颗二叉搜索树,第 i i i次插入的权值为 ( a + b i ) m o d    m (a+bi)\mod m (a+bi)modm,求第 n n n次插入点的深度。
n ≤ 1 0 16 , a , b , m ≤ 1 0 8 n\le 10^{16},a,b,m\le 10^8 n≤1016,a,b,m≤108
Solution
观察到 a + b i m o d    m a+bi\mod m a+bimodm的循环节是 m ( b , m ) \frac{m}{(b,m)} (b,m)m,间隔是 d = ( b , m ) d=(b,m) d=(b,m).
观察插入方式,可以发现如果把 n n n个点以权值为下标,插入时间做两个单调栈,长度和就是深度。
注意到 2 ∗ m d 2*\frac{m}{d} 2∗dm轮后的深度每次只会 + 1 +1 +1。
但是第 x x x与 x + m d x+\frac{m}{d} x+dm轮的深度不一定为 1 1 1,所以我们需要一个函数能快速求出第 n n n个插入点的深度。
不妨继续考虑那两个单调栈,可以发现这两个单调栈是成log段等差分布。
原因很显然。
于是问题可以转化为求 l ≤ a + b x ≤ r ( m o d    m ) l\le a+bx\le r(\mod m) l≤a+bx≤r(modm)的最小 x x x。
可以用类欧做到一个log的复杂度。
时间复杂度就是两个log