您的位置:首页 > 其它

RMQ-ST模板

2015-06-01 16:54 399 查看
#include<iostream>

#include<cstdio>

#include<string.h>

#include<cstring>

#include<string>

#include<stack>

#include<set>

#include<algorithm>

#include<cmath>

#include<vector>

#include<map>

#define LOCAL

#define ll long long

#define lll unsigned long long

#define MAX 1000009

#define eps 1e-8

#define INF 0x7fffffff

#define mod 1000000007

using namespace std;

/*

题意:RMQ-ST算法

想法:模板

*/

int A[MAX];

int dp[1009][1009];

int n ;

int RMQ_init()

{

for(int i = 1; i<=n; i++) dp[i][0] = A[i];//初始化

for(int j = 1; (1<<j)<=n; j++)//2的j次方

for(int i = 1; i + j - 1<=n; i++)//从i开始,长度为2的j次方的一段元素的最小值

dp[i][j] = min(dp[i][j- 1],dp[i+(1<<(j- 1))][j - 1]);

}

int RMQ(int L,int R)

{

int k = 0;

while((1<<(k+1))<=R - L + 1)k++;//找到符合L - R的符合区间

return min(dp[L][k],dp[R - (1<<k) + 1][k]);//返回区间最小值



}

int main()

{

//freopen("date.in","r",stdin);

int m;

cin>>n;

for(int i = 1;i<=n;i++)

{

cin>>A[i];

}

RMQ_init();

cin>>m;

while(m--)

{

int x,y;

cin>>x>>y;

if(x>y) swap(x,y);

cout<<RMQ(x,y)<<endl;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: