当前位置: 首页 > news >正文

倍增 st表 RMQ问题

本章我们来谈谈,倍增 && st表 && RMQ问题。

倍增

        倍增即成倍增长。是指我们在进行递推时,如果状态空间很大,线性递推无法满足时空要求,此时可以考虑成倍增长的方式,只递推状态空间在2的整数次幂位置上的值作为代表,其他值可以通过“任意整数可以表示成若干个 的次幂项的和”这一性质得到。

        其实纯倍增的题

ST表

ST 表(Sparse Table,稀疏表)是用于解决可重复贡献问题的数据结构。

例如:给定个数,n个询问,对于每个询问,求解区间 [l, r] 的极值(如最大值,最小值...)。

但是其实对这种朴实无华的DP,可以用倍增去优化。

就相当于把前一半和后一半取一个最小值,f(i,j)表示第[i,i+2^j-1]之间的最小值,如果理解不了可以想2^0-1 = 0,那么[i,i+0]就是a[i]本身那个数,后面同理....

模板代码

见Acwing:1273. 天才的记忆

#include<bits/stdc++.h>
using namespace std;const int N  = 2*1e5+10,M = 18;int n,m;
int w[N];
int f[N][M]; //运用倍增的思想,f(i,j)表示从i开始到i到i+2^j的区间最大值void init(){for(int j = 0; j < M; j++){for(int i = 1; i+(1 << j)-1 <= n; i++){if(!j) f[i][j] = w[i];//i——i+2^j区间最大值可以转化为i——i+2^(j-1),和i+2^(j-1)——i+2^(j-1)+2^(j-1)中间虽然有重复部分但是取最大值else f[i][j] = max(f[i][j-1],f[i+(1 << (j-1))][j-1]);}}
}int query(int l,int r){int len = r-l+1;int k = log(len)/log(2);return max(f[l][k],f[r-(1 << k)+1][k]);
}int main(){cin >> n;for(int i = 1; i <= n; i++) cin >> w[i];init();cin >> m;while (m -- ){int l, r;cin >> l >> r;cout << query(l,r) << endl;}return 0;
}


http://www.mrgr.cn/news/65470.html

相关文章:

  • 如何生成 PEM 格式的 SSH 密钥 ?
  • python爬取旅游攻略(1)
  • ctfshow web系列
  • Harmony Next集成支付宝sdk失败
  • 红黑树的平衡之舞:数据结构中的优雅艺术
  • 如果 MySQL 主库出现了问题,从库该何去何从呢?
  • 【ARM Linux 系统稳定性分析入门及渐进 1.3 -- Crash 工具调用】
  • 原生鸿蒙应用市场:开发者的新机遇与深度探索
  • 自恋型人格障碍
  • Spring连接数据库(以配置类的形式)
  • flutter 专题二 Flutter状态管理之Riverpod 0.8.4
  • 前端技术月刊-2024.11
  • JZ7 重建二叉树
  • Docker:网络 Network
  • 【大语言模型学习笔记】第一篇:LLM大规模语言模型介绍
  • 【Mac】安装 VMware Fusion Pro
  • 网络安全到底是什么?看完你就懂了(附学习资料)
  • Linux云计算个人学习总结(一)
  • ProLightsfx新的出发–从CSDN到WordPress
  • 晟矽微LVD低电压检测案例分析
  • 请你谈一谈闭包?详细解释闭包的概念、形成原因、作用及与作用域、垃圾回收机制的关系
  • Python并发编程库:Asyncio的异步编程实战
  • 一文搞懂python虚拟环境配置及使用pyenv进行python多版本管理
  • 【AI】【提高认识】通往通用人工智能之路:现实与幻想的交汇
  • 学习RocketMQ(记录了个人艰难学习RocketMQ的笔记)
  • 宠物用品市场分析,宠物用品什么最好卖?