首页 > 其他分享 >12th 2022/7/11 RMQ专题复习

12th 2022/7/11 RMQ专题复习

时间:2022-09-23 19:57:39浏览次数:73  
标签:11 ... RMQ 树状 int 12th 然后 ST 区间

分为三类吧

线段树

这种数据结构挺有用的,使用范围是时间,看着办嘛,\(O(n\log n)\)的算法,修改加入查询都是\(O(\log n)\)

然后建树\(O(n\log n)\)

看着办

大概思路就是将一个节点看做是一段区间,然后左子右子继承各区间的一半这样

实现还有各种创新

【GDOI2005】山海经

这种合并左右壁的

空间:4N

时间:如上

树状数组

首先知道lowbit函数

就是\(lowbit(x)=x\space and(x\bigoplus(x-1))\)

然后加入就是影响到后面的,所以就是

while(k<=n){
    f[k]+=delta;
    k+=lowbit(k);
}

然后求呢,树状数组不能求区间最大值,因为它一次只能求1-n的值

求的话,就是看前面的了

while(k>0){
    sum+=f[k];
    k-=lowbit(k);
}

然后时间与线段树一样

空间是N

但别看它码量少,它的功能不如线段树

前缀和

这个。。。

打个标题就算了

水沝㴇淼㵘爆了

倍增

一大利器

以\(f_{i}\)的形式存着,表示着\(2^i\)的意义,

方便转移,因为\(f_{i-1}\)

就是它的二分之一范围

应用之一:ST表

求区间最大值的,离线算法

有数\(a_{1...n}\)

设\(ST_{i,j}\)

为\(\max(a_{j...j+2^i-1})\)

然后转移就是枚举i,j,然后\(ST_{i,j}=\max(ST_{i-1,j},ST_{i-1,j+2^{i-1}})\)

也挺好想的哈

当然,初值就是\(ST_{0,i}=a_i\)

最后求答案

因为倍增的区间不一定能刚好覆盖l-r这个区间,嗯,其实也行,因为是倍增嘛,可以用倍增大片大片地跳

但这里再给出一个方法

就是找到起始位为l,能覆盖l-r区间左边一半的区间,然后再找到末尾为r,能覆盖l-r区间右半边的区间,然后求着两个区间的最大值就是整个区间的最大值了

这里给出代码

#include<cstdio>
#include<cmath>
using namespace std;
int n,m,a[100001];
int f[21][100001];
int l,r,s,len;
int max(int x,int y){
	return x>y?x:y;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		f[0][i]=a[i];
	}
	int l=log2(n),p=1;
	for(int i=1;i<=l;i++){
		for(int j=1;j+2*p-1<=n;j++){
			f[i][j]=max(f[i-1][j],f[i-1][j+p]);
//			printf("%d ",f[i][j]);
		}
//		printf("\n");
		p*=2;
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&l,&r);
		s=log2(r-l+1);
		len=pow(2,s);
		printf("%d\n",max(f[s][l],f[s][r-len+1]));
	}
}

应用之二:树套树、二维树状数组

这两个,就是求区间\(f_{l1...r1,l2...r2}\)的值了啊

套起来用就行

树状数组直接二重循环

线段树就是先找一维,再找另一维,分开两个函数大比较轻松,当然,一个函数中,分成四份向下查找那也行

总结

这便是RMQ了啊,比起谈论,更重要的是注意细节

嗯,当然,还有运用

标签:11,...,RMQ,树状,int,12th,然后,ST,区间
From: https://www.cnblogs.com/tlz-place/p/16724031.html

相关文章

  • Qt-Qt在开发过程中提示“报错C1189 No Target Architecture”
    相关资料:https://blog.csdn.net/wcc27857285/article/details/85197877 问题现象:有个启动外部bat文件的工程,今天突然想再建个相同功能的工程。代码如“WinExec("D:/a.b......
  • Wallys/QCN9024/QCN9074/QCN6024 802.11ax 4x4 MU-MIMO 6GHz wifi6E//AR9582 2x 2 900
    QCN9074802.11ax4x4MU-MIMO6GHzwifi6E QCN907411ax4x46GM.2// AR95822x2900M802.11an AR95822x2MIMOIndustrial-grade902-928Mhz  QCN602......
  • 【NEERC2011】【GYM100085F】Flights 题解
    【NEERC2011】【GYM100085F】Flights题意给定\(n\)个抛物线,保证开口向下且与\(x\)轴的两个交点都在\(x\)轴正半轴或原点。\(m\)次询问,每次询问给定四个数\(L,R,......
  • 详细解析11月前能影响加息的数据 点阵图带来的情绪开始缓解 — 2022.9.23
    详细解析11月前能影响加息的数据点阵图带来的情绪开始缓解—2022.9.23九月份的加息结束,以及点阵图带来的终端利率走势,风险市场的情绪持续反而出现了乐观的局面,随着凌晨......
  • Codeforces Round #811
    目录写在前面ABCDEFG写在最后写在前面比赛地址:https://codeforces.com/contest/1714。没什么整理价值的题,但是markdown语法及博客文风复健。A\(t\)组数据,每组数据......
  • 洛谷 P1114 “非常男女”计划 (前缀和)
    https://www.luogu.com.cn/problem/P1114题目大意:给定一排数字,让我们求出最大的区间内1和0的个数相等时的区间长度。输入9010001100输出6输入10011......
  • VM11安装Mac OS X 10.10
    工具/原料1.VMwareWorkstation11、122.unlocker206(forOSX插件补丁)3.MacOSX10.10镜像方法/步骤1有图有真相,哈哈2一、......
  • Linux0.11 新体验
    WHY为什么是新体验,目前的Linux内核代码对于学习操作系统来说不太合适,其代码量非常庞大,而被用来学习Linux内核的0.11版本和现代的操作系统相比较有如下缺点:1,Linux0.11的进程......
  • Android 11 存储权限适配指南
    (1)Android权限分类普通权限:只需要在清单文件中注册即可危险权限:需要在代码中动态申请,以弹系统Dialog的形式进行请求特殊权限:需要在代码中动态申请,以跳系统Activity......
  • ORACLE11gR2完全卸载
     1. 停止“服务”中所有的ORCLE服务。进入服务的方法很多,如:(1)在运行中输入services.msc,然后找到所有跟oracle 有关的服务。(2)开始->设置->控制面板->管理工具->服......