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
- POJ 3264 Balanced Lineup【RMQ問題】MQ
- RMQ問題的各種解法MQ
- 二維偏序問題
- 資料結構——RMQ(ST表)問題資料結構MQ
- 二維費用揹包問題
- 圖解二維完全揹包問題——降維打擊圖解
- HDU 3486 Interviewe(RMQ+二分)ViewMQ
- 關於二維陣列指標的問題陣列指標
- 二維碼問題上的一些思考
- 二維陣列作為引數傳遞問題陣列
- RMQMQ
- Spring MVC from 表單接收二維陣列的問題SpringMVC陣列
- RMQ模板MQ
- 記一次坑爹的golang 二維map判斷問題Golang
- RMQ求lcaMQ
- 淺談RMQMQ
- 問題 F: 開燈問題(第二講)
- 運維排查問題常用sql運維SQL
- C的二維陣列(習題)陣列
- 線段樹--RMQMQ
- HDU Find the hotel(RMQ)MQ
- kafka 運維中遇到的問題Kafka運維
- 微信活碼技術如何解決微信群二維碼失效問題
- HDU 3183 A Magic Lamp (RMQ)LAMPMQ
- 程式碼隨想錄演算法訓練營第41天 | 01揹包問題 二維 、 01揹包問題 一維 、 416. 分割等和子集演算法
- 二維字首和 & 二維差分
- [Android] Toast問題深度剖析(二)AndroidAST
- OOM分析之問題定位(二)OOM
- 豎式問題(第二講)
- 測試面試問題(二)面試
- 前端常見問題(二)- html前端HTML
- POJ3264 Balanced Lineup【RMQ】MQ
- 運維記錄1——解決在Nginx下部署CRA專案,二級目錄不能訪問的問題運維Nginx
- 【MISC】一道假的二維碼題目學習zxing庫[python解讀二維碼]Python
- Java基礎(四)——switch語句、一維陣列、二維陣列的定義、儲存、遍歷、常見問題Java陣列
- 線性最小二乘問題