6237. 【NOI2019模拟2019.6.28】抬头仰望梦的脚步(类欧 +数学)

很久没有写博客了,还是写一篇吧。

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 n1016,a,b,m108

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} 2dm轮后的深度每次只会 + 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) la+bxr(modm)的最小 x x x

可以用类欧做到一个log的复杂度。

时间复杂度就是两个log

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值