专栏文章

RMQ

算法·理论参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minjnuye
此快照首次捕获于
2025/12/02 03:30
3 个月前
此快照最后确认于
2025/12/02 03:30
3 个月前
查看原文

一维RMQ模板

CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5,logn=20;
int log[N],f[N][logn+5],a[N];
int n,m,x,y;
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]);
	log[0]=-1;
	for(int i=1;i<=n;++i) f[i][0]=a[i],log[i]=log[i>>1]+1;
	for(int j=1;j<=logn;++j)
	for(int i=1;i+(1<<j)-1<=n;++i) f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]);
	while(m--)
	{
		scanf("%d%d",&x,&y);
		int t=log[y-x+1];
		printf("%d\n",max(f[x][t],f[y-(1<<t)+1][t]));
	}
	return 0;
}

二维RMQ模板

CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,K,f[255][255][10][10],a[255][255],p[10]={1},logn[255]={-1};
int main()
{
	scanf("%d%d%d",&n,&m,&K);
	for(int i=1;i<=255;i++) logn[i]=logn[i>>1]+1;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
	for (int i=1;i<=7;i++) p[i]=p[i-1]*2;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++) f[i][j][0][0]=a[i][j];
	for(int k=0;k<=7;k++)
	for(int l=0;l<=7;l++)
	if(k+l!=0)
	for(int i=1;i+(1<<k)-1<=n;i++)
	for(int j=1;j+(1<<l)-1<=m;j++)
	if(!l) f[i][j][k][l]=max(f[i][j][k-1][l],f[i+p[k-1]][j][k-1][l]);
	else f[i][j][k][l]=max(f[i][j][k][l-1],f[i][j+p[l-1]][k][l-1]);
	while(K--)
	{
		int x1,y1,x2,y2;
		scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
		int k=logn[x2-x1+1],l=logn[y2-y1+1];
		printf("%d\n",max(f[x1][y1][k][l],max(f[x2-p[k]+1][y1][k][l],max(f[x1][y2-p[l]+1][k][l],f[x2-p[k]+1][y2-p[l]+1][k][l]))));
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...