倍增求RMQ
RMQ,即区间最值查询,给定一个序列,求区间l-r的最大值、最小值。
st表求RMQ,预处理On*logn,查询O1。
预处理:
- void init_rmq()
- {
- for(rll j=1;j<=lg[n];++j)//从当前点开始的2的j次方个点
- {
- for(rll i=1;(i+(1<<j)-1)<=n;++i)//i+(1<<j)-1不能越界
- {
- f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);//取最大值
- }
- }
- }
查询:
这里l到r不一定刚好是2^j,这里要么越界,要么有重复。
我们是求最值,又不是求和,有没有重复又有什么关系呢?那我们就让他有重复的部分。
代码:
- ll rmq(ll l,ll r)
- {
- ll k=log(r-l+1)/log(2);//处理log
- return max(f[l][k],f[r-(1<<k)+1][k]);//这里有重合部分,但重合部分取最大值不影响最后结果(又不是求和)
- }
一道简单的例题:
信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)
代码:
- #include<bits/stdc++.h>
- #define ll long long
- #define rint register int
- #define rll register long long
- using namespace std;
- const ll N=1e5+5;
- ll n,m;
- ll f[N][20];
- int lg[N];
- inline ll read()
- {
- ll x=0;
- bool flag=false;
- char ch=getchar();
- while(ch<'0'||ch>'9')
- {
- if(ch=='-') flag=true;
- ch=getchar();
- }
- while(ch>='0'&&ch<='9')
- {
- x=(x<<3)+(x<<1)+(ch^'0');
- ch=getchar();
- }
- return flag?~x+1:x;
- }
- void init_rmq()
- {
- for(rll j=1;j<=lg[n];++j)//从当前点开始的2的j次方个点
- {
- for(rll i=1;(i+(1<<j)-1)<=n;++i)//i+(1<<j)-1不能越界
- {
- f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);//取最大值
- }
- }
- }
- ll rmq(ll l,ll r)
- {
- ll k=log(r-l+1)/log(2);//处理log
- return max(f[l][k],f[r-(1<<k)+1][k]);//这里有重合部分,但重合部分取最大值不影响最后结果(又不是求和)
- }
- int main()
- {
- n=read(),m=read();//n 点的个数 m 操作数
- for(rll i=1;i<=n;++i)
- {
- f[i][0]=read();//读入数据
- }
- for(rint i=1;i<=n;++i)
- {
- lg[i]=lg[i-1]+(1<<lg[i-1]==i);//处理log
- }
- init_rmq();//初始化
- for(rll l,r,i=1;i<=m;++i)
- {
- l=read(),r=read();
- printf("%lld\n",rmq(l,r));//查询
- }
- return 0;
- }
倍增求RMQ的更多相关文章
- 倍增求LCA学习笔记(洛谷 P3379 【模板】最近公共祖先(LCA))
倍增求\(LCA\) 倍增基础 从字面意思理解,倍增就是"成倍增长". 一般地,此处的增长并非线性地翻倍,而是在预处理时处理长度为\(2^n(n\in \mathbb{N}^+)\ ...
- 树上倍增求LCA(最近公共祖先)
前几天做faebdc学长出的模拟题,第三题最后要倍增来优化,在学长的讲解下,尝试的学习和编了一下倍增求LCA(我能说我其他方法也大会吗?..) 倍增求LCA: father[i][j]表示节点i往上跳 ...
- [算法]树上倍增求LCA
LCA指的是最近公共祖先(Least Common Ancestors),如下图所示: 4和5的LCA就是2 那怎么求呢?最粗暴的方法就是先dfs一次,处理出每个点的深度 然后把深度更深的那一个点(4 ...
- 【倍增】洛谷P3379 倍增求LCA
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- 模板 倍增维护RMQ
倍增维护RMQ,nlogn预处理,O(1)查询 #include<bits/stdc++.h> using namespace std; const int maxn = 1e5+7; s ...
- hdu 2586 How far away ? 倍增求LCA
倍增求LCA LCA函数返回(u,v)两点的最近公共祖先 #include <bits/stdc++.h> using namespace std; *; struct node { in ...
- 倍增求lca模板
倍增求lca模板 https://www.luogu.org/problem/show?pid=3379 #include<cstdio> #include<iostream> ...
- 【题解】洛谷P4180 [BJWC2010] 严格次小生成树(最小生成树+倍增求LCA)
洛谷P4180:https://www.luogu.org/problemnew/show/P4180 前言 这可以说是本蒟蒻打过最长的代码了 思路 先求出此图中的最小生成树 权值为tot 我们称这棵 ...
- 树链剖分与倍增求LCA
树链剖分与倍增求\(LCA\) 首先我要吐槽机房的辣基供电情况,我之前写了一上午,马上就要完成的时候突然停电,然后\(GG\)成了送链剖分 其次,我没歧视\(tarjan LCA\) 1.倍增求\(L ...
随机推荐
- 一文了解RPC框架原理
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 1.RPC框架的概念 RPC(Remote Proced ...
- 文件传输协议:FTP、TFTP、SFTP有什么区别?
一个执着于技术的公众号 FTP 提供一种在服务器和客户机之间上传和下载文件的有效方式:是基于TCP的传输,FTP采用双TCP连接方式:支持授权与认证机制,提供目录列表功能. ---控制连接使用TCP端 ...
- 轮播——swiper
swiper组件 1.轮播数据是使用ajax进行填充的话,可能数目是0~n,在数目是1时,轮播会出现一些问题(出现空白侧),这时需作出判断(一张图片不滑动,多张就就行滑动),方法如下(以下方法中,si ...
- CentOS7软件环境
一.软件环境 1.1 centos7 [root@centos7 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [r ...
- mysql查询关键字补充与多表查询
目录 查询关键字补充 having过滤 distinct去重 order by排序 limit分页 regexp正则 多表查询 子查询 连表查询 查询关键字补充 having过滤 关键字having和 ...
- Pandas 分组聚合 :分组、分组对象操作
1.概述 1.1 group语法 df.groupby(self, by=None, axis=0, level=None, as_index: bool=True, sort: bool=True, ...
- BERT的优化演进方法汇总(持续更新)
模型结构演进 本文以演进方向和目的为线索梳理了一些我常见到但不是很熟悉的预训练语言模型,首先来看看"完全版的BERT":RoBERTa: A Robustly Optimized ...
- CF1682F MCMF?
题意: 费用流,其实bushi 给你长为\(n\)的序列\(a\),\(b\).\(a\)单增,\(b\)有正有负. \(q\)次询问\([l,r]\),保证\(\sum\limits_{i=l}^r ...
- 行列式&矩阵树定理
行列式: 参考 oi-wiki 定义 对于一个\(n*n\)的矩阵A行列式取值(标量) \(det(A)=|A|=\sum\limits_p(-1)^{\tau(p)}\prod\limits_{i= ...
- JNPF移动办公解决方案
市场背景 随着办公自动化系统的普及,电子化.数据化的办公方式已进入越来越多的企业和政府单位,信息化的办公系统在企事业内部编织起一套高效.畅通的信息互联体系,极大推动了企事业单位生产力的发展.但与此同时 ...