HDU 2888 二维RMQ 模板

来源:互联网 发布:linux find命令详解 编辑:程序博客网 时间:2024/05/21 21:02
#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居然CEint 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 ) ;}}}

0 0
原创粉丝点击