RMQ算法模板
来源:互联网 发布:数据分析师知乎 编辑:程序博客网 时间:2024/05/16 09:59
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <vector>#include <map>using namespace std;#define maxs( a , b ) a>b?a:b#define mins( a , b ) a>b?b:aconst int MAXN = 100005;int d[MAXN];int dpmin[MAXN][20];int dpmax[MAXN][20];int n;void create_Dpmin(){ int i , j; for( i = 1 ; i <= n ; i++ ) dpmin[i][0] = d[i]; for( j = 1 ; j <= log((double)(n+1))/log(2.0) ; j++ ){ for( i = 1 ; i+(1<<j)-1 <= n ; i++ ){ dpmin[i][j] = mins( dpmin[i][j-1] , dpmin[i+(1<<(j-1))][j-1] ); } } }void create_Dpmax(){ int i , j; for( i = 1 ; i <= n ; i++ ) dpmax[i][0] = d[i]; for( j = 1 ; j <= log((double)(n+1))/log(2.0) ; j++ ){ for( i = 1 ; i+(1<<j)-1 <= n ; i++ ){ dpmax[i][j] = maxs( dpmax[i][j-1] , dpmax[i+(1<<(j-1))][j-1] ); } } }int getmax( int a , int b ){ int k = (int)(log((double)(b-a+1))/log(2.0)); return maxs( dpmax[a][k] , dpmax[b-(1<<k)+1][k] ); }int getmin( int a , int b ){ int k = (int)(log((double)(b-a+1))/log(2.0)); return mins( dpmin[a][k] , dpmin[b-(1<<k)+1][k] ); }void Init(){ create_Dpmin(); create_Dpmax(); }int main(){ freopen( "in.txt" , "r" , stdin ); int T ; string A, B; for(scanf("%d", &T); T--;) { int i , m , a , b; scanf("%d%d", &n, &m); for( i = 1 ; i <= n ; i++ ){scanf("%d", &d[i]); // a为b的父亲 } Init(); while( m-- ){ scanf("%d%d",&a,&b); printf("%d\n",getmin(a,b)); //getmax(a, b)为找a, b中最大的那个数字。 } } return 0; }