倍增法(ST算法)

倍增法(ST算法)是一种用于解决区间最大值问题的优化算法,适用于多次询问的情况。算法通过预处理和询问阶段,高效地找到序列中某段区间的最大值。文章介绍了算法思想,提供了模板代码,并通过洛谷3865题和CF1335F题的题解,展示了ST算法在实际问题中的应用。
摘要由CSDN通过智能技术生成

倍增法(ST算法)

1.算法描述

算法思想

st算法,适用于RMQ问题(区间最大值),也就是求出一个序列中,数值最大的一项。朴素做法自然是一遍扫描找最大值,但是当题目询问次数很多的时候,就很有可能超时,因此用倍增算法来进行一个优化。

以下是st算法求解RMQ问题的实现:

首先,我们用 f [ i ] [ j ] f[i][j] f[i][j]来表示在序列a中,第i位数字以后数 2 j 2^j 2j个数之中的最大值,那么就可以得到 f [ i ] [ 0 ] = a [ i ] f[i][0]=a[i] f[i][0]=a[i]

接下来进行一个DP的过程:

for (int j = 1; j <= (log2(n)); j++)
    for (int i = 1; i <= n - (1 << j) + 1; i++)
        f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);

2.模板

2.1 预处理

// 预处理
void pre_work() {
   
    for (int i = 1; i <= n; ++i) f[i][0] = a[i];  // 处理长度为1的区间
    int t = log(n) / log(2) + 1;                  // 计算分段数
    for (int j = 1; j < t; ++j)                   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值