poj--2019Cornfields+二維RMQ問題
題目連結:點選進入
就是一個二維的RMQ問題,其實二維線段樹或則是樹狀陣列都是可以做的,但是二維的ST演算法編碼還是要簡單一點。下面這份程式碼可以作為二維ST演算法的模板用。
程式碼如下:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int val[255][255];
int mm[255];
int dpmin[255][255][8][8];//最小值
int dpmax[255][255][8][8];//最大值
void initRMQ(int n,int m)
{
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++)
dpmin[i][j][0][0] = dpmax[i][j][0][0] = val[i][j];
for(int ii = 0; ii <= mm[n]; ii++)
for(int jj = 0; jj <= mm[m]; jj++)
if(ii+jj)
for(int i = 1; i + (1<<ii) - 1 <= n; i++)
for(int j = 1; j + (1<<jj) - 1 <= m; j++)
{
if(ii)
{
dpmin[i][j][ii][jj] = min(dpmin[i][j][ii-1][jj],dpmin[i+(1<<(ii-1))][j][ii-1][jj]);
dpmax[i][j][ii][jj] = max(dpmax[i][j][ii-1][jj],dpmax[i+(1<<(ii-1))][j][ii-1][jj]);
}
else
{
dpmin[i][j][ii][jj] = min(dpmin[i][j][ii][jj-1],dpmin[i][j+(1<<(jj-1))][ii][jj-1]);
dpmax[i][j][ii][jj] = max(dpmax[i][j][ii][jj-1],dpmax[i][j+(1<<(jj-1))][ii][jj-1]);
}
}
}
///查詢矩形的最大值
int rmq1(int x1,int y1,int x2,int y2)
{
int k1 = mm[x2-x1+1];
int k2 = mm[y2-y1+1];
x2 = x2 - (1<<k1) + 1;
y2 = y2 - (1<<k2) + 1;
return max(max(dpmax[x1][y1][k1][k2],dpmax[x1][y2][k1][k2]),max(dpmax[x2][y1][k1][k2],dpmax[x2][y2][k1][k2]));
}
///查詢矩形的最小值
int rmq2(int x1,int y1,int x2,int y2)
{
int k1 = mm[x2-x1+1];
int k2 = mm[y2-y1+1];
x2 = x2 - (1<<k1) + 1;
y2 = y2 - (1<<k2) + 1;
return min(min(dpmin[x1][y1][k1][k2],dpmin[x1][y2][k1][k2]),min(dpmin[x2][y1][k1][k2],dpmin[x2][y2][k1][k2]));
}
int main()
{
//freopen("in.txt","r",stdin);
mm[0] = -1;
for(int i = 1;i <= 500;i++)
mm[i] = ((i&(i-1))==0)?mm[i-1]+1:mm[i-1];
int N,B,K;
while(scanf("%d%d%d",&N,&B,&K)==3)
{
for(int i = 1;i <= N;i++)
for(int j = 1;j <= N;j++)
scanf("%d",&val[i][j]);
initRMQ(N,N);
int x,y;
while(K--)
{
scanf("%d%d",&x,&y);
printf("%d\n",rmq1(x,y,x+B-1,y+B-1)-rmq2(x,y,x+B-1,y+B-1));
}
}
return 0;
}
相關文章
- HDU 2888 Check Corners(二維RMQ)MQ
- $RMQ$問題($ST$表)MQ
- RMQ問題的各種解法MQ
- 二維偏序問題
- 資料結構——RMQ(ST表)問題資料結構MQ
- 二維費用揹包問題
- POJ 3264 Balanced Lineup【RMQ問題】MQ
- UVA 11235 經典RMQ問題MQ
- 圖解二維完全揹包問題——降維打擊圖解
- 關於二維陣列指標的問題陣列指標
- 二維陣列作為引數傳遞問題陣列
- 二維碼問題上的一些思考
- HDU 3486 Interviewe(RMQ+二分)ViewMQ
- RMQMQ
- P2216 [HAOI2007]理想的正方形(二維RMQ)MQ
- RMQ模板MQ
- Spring MVC from 表單接收二維陣列的問題SpringMVC陣列
- 記一次坑爹的golang 二維map判斷問題Golang
- 淺談RMQMQ
- RMQ求lcaMQ
- C的二維陣列(習題)陣列
- 微信活碼技術如何解決微信群二維碼失效問題
- 運維排查問題常用sql運維SQL
- Codeforces Round #361 (Div. 2) D RMQ+二分MQ
- HDU Find the hotel(RMQ)MQ
- RMQ演算法MQ演算法
- 線段樹--RMQMQ
- 二維字首和 & 二維差分
- 測試面試問題(二)面試
- kafka 運維中遇到的問題Kafka運維
- 面試題——二維陣列中的查詢面試題陣列
- 3339: Rmq ProblemMQ
- 程式碼隨想錄演算法訓練營第41天 | 01揹包問題 二維 、 01揹包問題 一維 、 416. 分割等和子集演算法
- OOM分析之問題定位(二)OOM
- 前端常見問題(二)- html前端HTML
- AIX常見問題整理(二)AI
- mysql 問題處理二則MySql
- Josephus問題解決方法二