1. 程式人生 > >HDU 2888 (二維RMQ)

HDU 2888 (二維RMQ)

題意:給出一個矩陣,每次詢問一個子矩陣中的最大元素,以及最大元素是不是和子矩陣的某個角相等.

二維RMQ的板子~

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#define Clear(x,y) memset (x,y,sizeof(x))
#define FOR(a,b,c) for (int a = b; a <= c; a++)
#define REP(a,b,c) for (int a = b; a >= c; a--) #define fi first #define se second #define pii pair<int, int> #define pli pair<long long, int> #define pb push_back #define mod 1000000007 using namespace std; #define maxn 305 int n, m; int val[maxn][maxn]; int dp[maxn][maxn][9][9]; void rmq_init () { for
(int row = 1; row <= n; row++) for(int col = 1; col <=m; col++) dp[row][col][0][0] = val[row][col]; int mx = log(double(n)) / log(2.0); int my = log(double(m)) / log(2.0); for(int i=0; i<= mx; i++) { for(int j = 0; j<=my; j++) { if(i == 0
&& j ==0) continue; for(int row = 1; row+(1<<i)-1 <= n; row++) { for(int col = 1; col+(1<<j)-1 <= m; col++) { if(i == 0)//y軸二分 dp[row][col][i][j]=max(dp[row][col][i][j-1],dp[row][col+(1<<(j-1))][i][j-1]); else//x軸二分 dp[row][col][i][j]=max(dp[row][col][i-1][j],dp[row+(1<<(i-1))][col][i-1][j]); } } } } } int rmq (int x1,int x2,int y1,int y2) { int kx = log(double(x2-x1+1)) / log(2.0); int ky = log(double(y2-y1+1)) / log(2.0); 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]; return max( max(m1,m2) , max(m3,m4)); } int main () { //freopen ("more.in", "r", stdin); //freopen ("out", "w", stdout); while (scanf ("%d%d", &n, &m) == 2) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { scanf ("%d", &val[i][j]); } } rmq_init (); int q; scanf ("%d", &q); while (q--) { int x, y, xx, yy; scanf ("%d%d%d%d", &x, &y, &xx, &yy); int ans = rmq (x, xx, y, yy); printf ("%d", ans); if (ans == val[x][y] || ans == val[xx][y] || ans == val[x][yy] || ans == val[xx][yy]) printf (" yes\n"); else printf (" no\n"); } } return 0; }

相關推薦

HDU 2888 (RMQ)

題意:給出一個矩陣,每次詢問一個子矩陣中的最大元素,以及最大元素是不是和子矩陣的某個角相等. 二維RMQ的板子~ #include <cstdio> #include <iostream> #include <cstri

ZOJ 題目2859 Matrix Searching(RMQ

ati ret ber 題目 req fin question quest -1 Matrix Searching Time Limit: 10 Seconds Memory Limit: 32768 KB Given an n*n matrix A,

HDU-2159 背包

裝備 urn 背包 stdio.h namespace logs set style bre 最近xhd正在玩一款叫做FATE的遊戲,為了得到極品裝備,xhd在不停的殺怪做任務。久而久之xhd開始對殺怪產生的厭惡感,但又不得不通過殺怪來升完這最後一級。現在的問題是,xhd

【bzoj1047】[HAOI2007]理想的正方形 RMQ

ace pre 處理方法 haoi2007 algorithm brush light ont bzoj1047 題目描述 有一個a*b的整數組成的矩陣,現請你從中找出一個n*n的正方形區域,使得該區域所有數中的最大值和最小值的差最小。 輸入 第一行為3個整數,分別表

洛谷 P2216 [HAOI2007]理想的正方形 || RMQ的單調隊列

pmi 最小值 typedef 關系 pan 算法 一行 ++ min 題目 這個題的算法核心就是求出以i,j為左上角,邊長為n的矩陣中最小值和最大值。最小和最大值的求法類似。 單調隊列做法: 以最小值為例: q1[i][j]表示第i行上,從j列開始的n列的最小值。

CodeForces 846D. Monitor(線段樹/RMQ)

題目大意:給予n,m,k,t 和 t 行i,j,val代表第i行j列的元素會在val天后損壞。求在整張(n*m)圖中求一個k*k的區域的數全部損壞的最小天數。試了一下二維線段樹,總結一下就是和一維的差別不大,從二叉樹變成了四叉樹(三維線段樹豈不是要八叉樹,喪心病狂)。總體上就是把一個長方形均分四塊,然後總的節

Triple HDU - 5517 —— 樹狀陣列

Given the finite multi-set A of n pairs of integers, an another finite multi-set B of m triples of integers, we define the product of A and B as a

RMQ 思想及模板

二維RMQ問題就是求一個矩陣N*M中的一個小塊矩陣內的最值問題.其中dmin[i][j][ii][jj]=x表示以(i, j)為左上角,以(i+(1<<ii)-1, j+(1<<jj)-1 )為右下角的矩陣內的最小值.dmax的值類似.    

poj2019 RMQ模板題

和hdu2888基本上一樣的,也是求一個矩陣內的極值 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> usin

HDU 1263 map

  要求:統計各個產地生產的各種水果數目。 Sample Input 1 5 apple shandong 3 pineapple guangdong 1 sugarcane guangdong 1 pineapple guangdong 3 pineapple guangdo

HDU2888(RMQ/線段樹 模板)

Check Corners Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3572&n

RMQ-------ST演算法

Poj 2019 Cornfields【二維RMQ-------ST演算法】 2016年08月03日 13:11:18 mengxiang000000 閱讀數:962 標籤: Poj 2019Pku 2019更多 個人分類: dp 版權宣

【洛谷2216】[HAOI2007] 理想的正方形(RMQ

點此看題面 大致題意: 求出一個矩陣中所有n∗nn*nn∗n正方形中極差的最小值。 另一種做法 聽說這題可以用單調佇列去做,但是我寫了一個二維RMQRMQRMQ。 二維RMQRMQRMQ RMQRM

poj 2019 Cornfields(RMQ)

Description FJ has decided to grow his own corn hybrid in order to help the cows make the best possible milk. To that end, he's looking t

RMQ問題

前置知識 問題引入 題目地址IN 對於一個n×mn\times mn×m的矩陣,每個格子有一個值,有QQQ個詢問,每次詢問你一個子矩陣中的最大值。 1≤n,m≤500,Q≤1061\leq n,

codeforces 731D (DP 二分 RMQ)

題意:給出一個01矩陣,每次詢問一個矩形中的最大全1正方形的邊長。 用dp[i][j]儲存以(i,j)為右下角的最大全1正方形,轉移方程就是dp[i][j]={min{dp[i−1][j],dp[i][j−1],dp[i−1][j−1]}+10(val[i

HDU 5517 (樹狀陣列)

題意:給出一個pair(a,b)集合A,triple(c,d,e)集合B,然後如果b和e相等可以把新的triple(a,c,d)扔到集合C.求C中的(a,b,c)個數使得C中不存在(u,v,e)滿足{(a,b,c)≠(u,v,e),a≤u,b≤v,c≤e}.

Codeforces713D(RMQ

區間最大子正方形問題。 預處理後二分答案驗證 AC Code: #include<bits/stdc++.h> #define maxn 1005 #define lim 10 using namespace std; int n,m,dp[maxn][maxn],

[HAOI2007]理想的正方形 BZOJ1047 RMQ

tdi deque 一行 brush tor 行為 har pre 空格 題目描述 有一個a*b的整數組成的矩陣,現請你從中找出一個n*n的正方形區域,使得該區域所有數中的最大值和最小值的差最小。 輸入輸出格式 輸入格式: 第一行為3個整數,分別表示a,b,n的值 第二行

P2216 [HAOI2007]理想的正方形 [RMQ]

com 最值 int 參考文獻 -h main pan bits del P2216 [HAOI2007]理想的正方形 這道題就是標準的二維RMQ模板。 回顧一下原來的RMQ,分兩個階段,先倍增的初始化,再\(O(1)\)地求答案。二維RMQ也是有異曲同工之妙的。 這個最值