HDU - 2888 Check Corners(二维RMQ)
来源:互联网 发布:mac 系统架构图 工具 编辑:程序博客网 时间:2024/05/22 03:20
题目大意:给你一个矩阵,Q个询问,询问的是一个矩阵内的最大值,并问这个最大值是否在询问的矩阵的四个角
解题思路:二维RMQ裸题
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 310;int n, m;int dp[N][N][9][9];int val[N][N];void init() { for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { scanf("%d", &val[i][j]); dp[i][j][0][0] = val[i][j]; } for (int i = 0; (1 << i) <= n; i++) { for (int j = 0; (1 << j) <= m; 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++) { //当x或y等于0的时候,就相当于一维的RMQ了 if (i == 0) dp[row][col][i][j] = max(dp[row][col][i][j - 1], dp[row][col + (1 << (j - 1))][i][j - 1]); else if (j == 0) dp[row][col][i][j] = max(dp[row][col][i - 1][j], dp[row + (1 << (i - 1))][col][i - 1][j]); else dp[row][col][i][j] = max(dp[row][col][i][j - 1], dp[row][col + (1 << (j - 1))][i][j - 1]); } } }}//本来一维RMQ询问的时候是一个区间,现在变成了一个矩形,所以需要四个角度int Query(int x1, int y1, int x2, int y2) { int kx = 0, ky = 0; while (x1 + (1 << (1 + kx)) - 1 <= x2) kx++; while (y1 + (1 << (1 + ky)) - 1 <= y2) ky++; 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));}void solve() { int q; scanf("%d", &q); while (q--) { int x1, y1, x2, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); int ans = Query(x1, y1, x2, y2); printf("%d", ans); if (ans == val[x1][y1] || ans == val[x2][y1] || ans == val[x1][y2] || ans == val[x2][y2]) printf(" yes\n"); else printf(" no\n"); }}int main() { while (scanf("%d%d", &n, &m) != EOF) { init(); solve(); } return 0;}
0 0
- hdu 2888Check Corners 二维rmq
- hdu 2888 Check Corners(二维rmq)
- HDU 2888 Check Corners(简单二维RMQ)
- HDU 2888 Check Corners 二维RMQ
- hdu 2888 Check Corners(二维RMQ)
- 【二维RMQ】hdu 2888 Check Corners
- HDU - 2888 Check Corners(二维RMQ)
- HDU 2888 Check Corners【二维RMQ】
- HDU 2888 Check Corners(简单二维RMQ)
- HDU-2888 Check Corners(二维RMQ)
- HDU 2888 Check Corners(二维RMQ)
- HDU 2888 Check Corners 二维RMQ模板
- Hdu 2888 Check Corners (数据结构_二维RMQ)
- HDU 2888 Check Corners (二维RMQ,3级)
- hdu 2888 Check Corners (二维rmq模版)
- HDU-2888——Check Corners(二维RMQ)
- hdu-2888 Check Corners(二维RMQ模板题)
- HDU 2888 Check Corners(二维RMQ模板)
- Linux 下 shell 编写 计算器
- SpringMVC使用ResponseBody报406错误
- Cocosd-x设计模式之七:防御式编程模式
- probit模型
- 杭电1418--欧拉定理
- HDU - 2888 Check Corners(二维RMQ)
- Ubuntu中Terminal和GNOME文件管理器的互通方法和命令
- 设计模式-简单工厂模式(实现,可与前文进行比较)
- cocos2d-x设计模式发掘之八:中介者模式
- leetcode-Binary Tree Paths
- 开始swift学习之路
- 黑马程序员-String类
- Java 引用传递的实验
- cocos2d-x设计模式发掘之九:委托模式