RMQ算法 模板

xiaoxiao2021-02-27  392

RMQ :用于求一个区间内的最大最小值

ST算法代码

时间复杂度:预处理O(n * log n)       查询O(1

#include <stdio.h> #include <iostream> #include <string.h> #include <stack> #include <algorithm> #include <queue> #include <map> #include <cmath> #define eps 0.000001 #define pi acos(-1,0) #define pr 999983 #define LL long long using namespace std; int n,m; int _2[20]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192}; int a[10000][100]; void RMQ(){ int z=0; while (_2[z]<=n) z++; for (int i = 1; i < z; i++){ for (int j = 0; j <= n-_2[i]; j++){ a[j][i]=min(a[j][i-1],a[j+_2[i-1]][i-1]); } } } int main(){ while (~scanf("%d",&n)){ for (int i = 0; i < n; i++){ scanf("%d",&a[i][0]); } RMQ(); scanf("%d",&m); while (m--){ int l,r,x; scanf("%d%d",&l,&r); x=(int)(log(r-l+1)/log(2.0)); printf("%d\n",min(a[l][x],a[r-(1<<x)+1][x])); } } return 0; }

不知名大神代码

时间复杂度:预处理O(n * log n)       查询O(log n

#include <stdio.h> #include <iostream> #include <string.h> #include <stack> #include <algorithm> #include <queue> #include <map> #include <cmath> #define eps 0.000001 #define pi acos(-1,0) #define pr 999983 #define LL long long using namespace std; int n,m; int _2[20]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192}; int a[10000][100]; int fd(int l,int x){ int z=0; while (_2[z]<=x) z++; z--; if (_2[z]<x) return min(a[l][z],fd(l+_2[z],x-_2[z])); return a[l][z]; } void RMQ(){ int z=0; while (_2[z]<=n) z++; for (int i = 1; i < z; i++){ for (int j = 0; j <= n-_2[i]; j++){ a[j][i]=min(a[j][i-1],a[j+_2[i-1]][i-1]); } } } int main(){ while (~scanf("%d",&n)){ for (int i = 0; i < n; i++){ scanf("%d",&a[i][0]); } RMQ(); scanf("%d",&m); while (m--){ int l,r,x; scanf("%d%d",&l,&r); x=r-l+1; printf("%d\n",fd(l-1,x)); } } return 0; }

转载请注明原文地址: https://www.6miu.com/read-5473.html

最新回复(0)