POJ 3264 RMQ模板

  
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std ;

const int N = 50000 + 11 ;

int fmin[N][30] , fmax[N][30] ;
int n , m ;

void init() {
	for(int i = 1 ; i<= n ; ++i) {
		scanf("%d" ,&fmax[i][0]) ;
		fmin[i][0] = fmax[i][0] ;
	}
	for(int i = 1 ; (1<<i) <= n ; ++i) {//第一個數會用到可能等於n的長度
		for(int j = 1 ; j+(1<<i)-1 <= n ; ++j) {//如果下標從0開始,這裏是小於
			fmax[j][i] = max(fmax[j][i-1] , fmax[j+(1<<(i-1))][i-1]) ;
			fmin[j][i] = min(fmin[j][i-1] , fmin[j+(1<<(i-1))][i-1]) ;
		}
	}
}

void query(int l , int r) {
	int k = 0 ;
	while((1<<(k+1)) <= r-l+1) ++k ;
	int a = max(fmax[l][k] , fmax[r-(1<<k)+1][k]) ;//這裏是r減去前面的長度,分成兩個可能有重疊的區間
	int b = min(fmin[l][k] , fmin[r-(1<<k)+1][k]) ;
	printf("%d\n" , a-b) ;
}

int main() {
	while(scanf("%d%d" ,&n ,&m)==2) {
		init() ;
		int a , b ;
		while(m--) {
			scanf("%d%d" ,&a ,&b) ;
			query(a , b) ;
		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章