RMQ简述

匿名 (未验证) 提交于 2019-12-02 23:32:01

RMQ主要用于区间内最值的多组查询,暴力枚举会超时的情况下

(当然如果你会线段树当我没说)

主要思想就是倍增+dp

 #include<bits/stdc++.h> using namespace std; const int N = 1e5+5; int dp[N][20]; int a[N]; void RMQ_build(int n){ 	for(int i=0; i<=n;i++) 	dp[i][0]=a[i]; 	for(int j = 1;(1<<j)<=n;j++) 	{ 		for(int i = 1 ; i+(1<<j)-1 <= N;i++) 		dp[i][j]=min(dp[i][j-1],dp[i+(1<<j-1)][j-1]);//找 最 值  	} }   int RMQ_query(int l,int r) { 	int k=(int)(log((double)(r-l+1))/log(2.0));     printf("%d ",min(dp[l][k],dp[r-(1<<k)+1][k]));  }  int main(){ 	int m,n,l,r; 	scanf("%d%d",&n,&m); 	for(int i=1;i<=n;i++) 	{ 		scanf("%d",&a[i]); 	} 	RMQ_build(n); 	for(int i=0;i<m;i++){ 		scanf("%d%d",&l,&r); 		RMQ_query(l,r); 	}  	 	return 0; 	 } 

文章来源: https://blog.csdn.net/qq_43206953/article/details/89737774
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!