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

探讨了在二叉搜索树中,通过特定公式计算节点深度的问题。利用单调栈和循环节理论,提出了一种高效算法,可在log时间内求得任意节点深度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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}2dm轮后的深度每次只会+1+1+1

但是第xxxx+mdx+\frac{m}{d}x+dm轮的深度不一定为111,所以我们需要一个函数能快速求出第nnn个插入点的深度。

不妨继续考虑那两个单调栈,可以发现这两个单调栈是成log段等差分布。

原因很显然。

于是问题可以转化为求l≤a+bx≤r(mod  m)l\le a+bx\le r(\mod m)la+bxr(modm)的最小xxx

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

时间复杂度就是两个log

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值