HDU 2888 二維RMQ 模板

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

const int N = 300 + 11 ;

int dp[N][N][9][9] ;
int n , m ;

void init() {
	for(int i = 1 ; i <= n ; ++i) {
		for(int j = 1 ; j <= m ;++j) {
			scanf("%d" ,&dp[i][j][0][0]) ;
		}
	}
	int m1 , m2 , m3 , m4 ;
	for(int r = 0 ; (1<<r) <= n ; ++r) {
		for(int c = 0 ; (1<<c) <= m ; ++c) {
			if(r == 0 && c == 0) continue ;
			for(int i = 1 ; i+(1<<r)-1 <= n ; ++i) {
				for(int j = 1 ; j+(1<<c)-1 <= m ; ++j) {
					if(r) {
						dp[i][j][r][c] = max(dp[i][j][r-1][c] , dp[i+(1<<(r-1))][j][r-1][c]) ;
					}else {
						dp[i][j][r][c] = max(dp[i][j][r][c-1] , dp[i][j+(1<<(c-1))][r][c-1]) ;//先算當r爲0的時候
					}
				}
			}
		}
	}
}

void query(int x1 , int y1 , int x2 , int y2) {
	int kx = (int)(log(x2 - x1 + 1.0)/log(2.0)) ;
	int ky = (int)(log(y2 - y1 + 1.0)/log(2.0)) ;//log2居然CE
	int m1 = dp[x1][y1][kx][ky] ;
	int m2 = dp[x2-(1<<kx)+1][y1][kx][ky] ;
	int m3 = dp[x1][y2-(1<<ky)+1][kx][ky] ;
	int m4 = dp[x2-(1<<kx)+1][y2-(1<<ky)+1][kx][ky] ;
	int tmp = max(m1 , max(m2 , max(m3 , m4))) ;//分爲4個部分
	printf("%d ", tmp) ;//以上爲二維RMQ模板
	if(dp[x1][y1][0][0] == tmp || dp[x1][y2][0][0] == tmp || dp[x2][y1][0][0] == tmp || dp[x2][y2][0][0] == tmp) {
		printf("yes\n") ;
	}else {
		printf("no\n") ;
	}
}

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

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