RMQ问题

本文深入探讨了RMQ算法的预处理及查询过程,预处理时间复杂度为nlogn,查询则实现线性效率。通过具体代码示例,讲解了区间查询的实现细节,包括初始化与查询函数的编写,适用于解决区间最小值、最大值或其它函数计算问题。

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

RMQ的预处理时间复杂度为nlogn,但是查找的话就是线性的。

https://vjudge.net/contest/228508#problem/B

专题连接

int st[maxm][17];//
int _gcd(int a,int b){return b?_gcd(b,a%b):a;}
void
init() { for(int j = 1; (1 << j) <= maxm; j++) {//j的范围要根据总的范围为2的几次方来定。 for(int i = 0; i + (1 << j) - 1 <= maxm; i++) {//这里maxm是总的范围,书上写的n,好恶心,如果是离散好了就是n,没离散就是maxm. st[i][j] = _gcd(st[i][j - 1], st[i + (1 << (j - 1)) ][j - 1]);//函数还可以是mix与maxm或者其他很多。 }                                         } } int query(int l, int r) { int k = 0; while((1 << (k + 1)) <= r - l + 1) k++; return _gcd(st[l][k], st[r - (1 << k) + 1][k]); }

https://vjudge.net/contest/228508#problem/A

这一题那个while循环注意看一下。注意下二分区间的范围,

右边界== n?????????????????????????????????

转载于:https://www.cnblogs.com/downrainsun/p/10295738.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值