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