Codeforces 713D Animals and Puzzle(二维ST表+二分答案)
题目链接 Animals and Puzzle
题意 给出一个1e3 * 1e3的01矩阵,给出t个询问,每个询问形如x1,y1,x2,y2
你需要回答在以$(x1, y1)$为左上角,$(x1, y2)$为右下角的子矩阵中,最大的全1正方形的边长。
首先考虑DP预处理。
$f[i][j]$表示以$f[i][j]$为右下角的最大的全1正方形的边长。
则$f[i][j] = min(f[i - 1][j], f[i][j - 1], f[i - 1][j - 1]) + 1$
我们对$f[i][j]$构建一张二维ST表,使我们能在$O(1)$的时间复杂度内求出$f[i][j](x1 <= i <= x2, y1 <= j <= y2)$
但是这样直接查询$f[i][j]$的最大值$(x1 <= i <= x2, y1 <= j <= y2)$是不行的。
因为查询到的最大全1子正方形并不一定都在以$(x1, y1)$为左上角,$(x1, y2)$为右下角的子矩阵中。
所以我们需要另外想办法。
我们可以判断一个答案x是否存在,先求出合法的$f[i][j] >= x$的范围,
也就是说如果找到$f[i][j] >= x$了,这个找到的全1子正方形一定都在以$(x1, y1)$为左上角,$(x1, y2)$为右下角的子矩阵中。
显然x是单调的,所以我们可以二分答案。
时间复杂度$O(nmlognm + t)$
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) const int N = 1e3 + 3;
const int M = 10; int f[N][N][M][M], lg[N];
int n, m, x, q; void ST(){
rep(i, 2, 1e3 + 1) lg[i] = lg[i >> 1] + 1;
rep(i, 1, n){
for (int k = 1; (1 << k) <= m; ++k){
rep(j, 1, m - (1 << k) + 1){
f[i][j][0][k] = max(f[i][j][0][k - 1], f[i][j + (1 << (k - 1))][0][k - 1]);
}
}
} for (int k1 = 1; (1 << k1) <= n; ++k1){
rep(i, 1, n - (1 << k1) + 1){
for (int k2 = 0; (1 << k2) <= m; ++k2){
rep(j, 1, m - (1 << k2) + 1){
f[i][j][k1][k2] = max(f[i][j][k1 - 1][k2], f[i + (1 << (k1 - 1))][j][k1 - 1][k2]);
}
}
}
}
} int query(int x1, int y1, int x2, int y2){
int k1 = lg[x2 - x1 + 1], k2 = lg[y2 - y1 + 1];
x2 = x2 - (1 << k1) + 1;
y2 = y2 - (1 << k2) + 1;
return max(max(f[x1][y1][k1][k2], f[x1][y2][k1][k2]), max(f[x2][y1][k1][k2], f[x2][y2][k1][k2]));
} int main(){ freopen("1.txt", "r", stdin);
freopen("2.txt", "w", stdout); scanf("%d%d", &n, &m); rep(i, 1, n){
rep(j, 1, m){
int x;
scanf("%d", &x);
if (x) f[i][j][0][0] = min(f[i - 1][j - 1][0][0],
min(f[i - 1][j][0][0], f[i][j - 1][0][0])) + 1;
else f[i][j][0][0] = 0;
}
} ST();
scanf("%d", &q);
while (q--){
int x1, y1, x2, y2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
int l = 0, r = min(x2 - x1, y2 - y1) + 1, ans = 0;
while (l <= r){
int mid = (l + r) >> 1;
if (query(x1 + mid - 1, y1 + mid - 1, x2, y2) >= mid) l = mid + 1, ans = mid;
else r = mid - 1;
} printf("%d\n", ans);
} return 0;
}
Codeforces 713D Animals and Puzzle(二维ST表+二分答案)的更多相关文章
- Codeforces Round #371 (Div. 1) D - Animals and Puzzle 二维ST表 + 二分
D - Animals and Puzzle #include<bits/stdc++.h> #define LL long long #define fi first #define s ...
- 【CodeForces】713 D. Animals and Puzzle 动态规划+二维ST表
[题目]D. Animals and Puzzle [题意]给定n*m的01矩阵,Q次询问某个子矩阵内的最大正方形全1子矩阵边长.n,m<=1000,Q<=10^6. [算法]动态规划DP ...
- BZOJ3577:玩手机(最大流,二维ST表)
Description 现在有一堆手机放在坐标网格里面(坐标从1开始),坐标(i,j)的格子有s_(i,j)个手机. 玩手机当然需要有信号,不过这里的手机与基站与我们不太一样.基站分为两种:发送站和接 ...
- BZOJ1047[HAOI2007]理想的正方形——二维ST表
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...
- 【洛谷 P2216】 [HAOI2007]理想的正方形(二维ST表)
题目链接 做出二维\(ST\)表,然后\(O(n^2)\)扫一遍就好了. #include <cstdio> #include <cstring> #include <a ...
- [模板]二维ST表
考试yy二维ST表失败导致爆零. 其实和一维的ST表很像... 也是设$f[i][j][p][q]$为以$(i, j)$为左上角,长为$2^p$,宽为$2^q$的矩形的最大值. 算法流程是先把每一行都 ...
- [HNOI2007] 理想正方形 二维ST表
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...
- Codeforces Round #371 (Div. 1) D. Animals and Puzzle 二维倍增
D. Animals and Puzzle 题目连接: http://codeforces.com/contest/713/problem/D Description Owl Sonya gave a ...
- [总结] 二维ST表及其优化
二维 \(\mathcal{ST}\) 表,可以解决二维 \(\mathcal{RMQ}\) 问题.这里不能带修改,如果要修改,就需要二维线段树解决了. 上一道例题吧 ZOJ2859 类比一维 \(\ ...
随机推荐
- 如何在Mac OS X中开启或关闭显示隐藏文件命令
打开终端,输入:defaults write com.apple.finder AppleShowAllFiles -bool true 此命令显示隐藏文件defaults write com.app ...
- LeetCode || 递归 / 回溯
呜呜呜 递归好不想写qwq 求“所有情况”这种就递归 17. Letter Combinations of a Phone Number 题意:在九宫格上按数字,输出所有可能的字母组合 Input: ...
- javase(12)_集合框架_Queue
一.Queue Queye接口体系图 体系分析: Deque实现类:ArrayDeque, LinkedList(数组和链表实现双向队列) BlockingDeque实现类:LinkedBlockin ...
- iOS利用UIDocumentInteractionController和Quick Look打开或预览文档
在App的开发过程中,我们避免不了要打开软件中的文件,例如:Excel文件,Word文件,图片文件等不同格式的文件或者想要通过第三方的App来打开这些文件,那么我们就要用到UIDocumentInte ...
- 【OS_Linux】Linux 基本命令整理
1. 查看目录文件:ls2. 打印当前工作目录:pwd3. 查看文件内容:cat 文件名4. 打开编辑器:vim 文件名 1 2 3 4 5 修改:按Insert键 退出修改模式:按Esc 键 进入输 ...
- (23)zabbix单位符号Unit symbols
概述 在zabbix里面,我们不需要使用大数字来,例如我们可以不使用86400来表示一天,这个数字又不容易理解也容易出错.用什么办法来解决大数字问题呢?我们可以使用单位来简化,例如简化zabbix触发 ...
- (转) iOS程序国际化
IOS程序国际化 本文转自http://www.cnblogs.com/zhidao-chen/archive/2012/07/08/2581977.html 1.1 新建一个Single View ...
- 设置 TabBarItemt图片颜色
UIImage *discussSelectedImage = [UIImage imageNamed:@"discuss_selected"];//设置图片不渲染 discuss ...
- (转)iOS完成学习路线
转自 MJ大神博客 原文地址http://blog.csdn.net/q199109106q/article/details/8596506 晚特地花时间整理出了iOS的完整学习路线图,希望对大家有帮 ...
- Lex与Yacc学习(三)之符号表
符号表 列举单词表的方式虽然简单但是不全面,如果在词法分析程序运行时可以构建一个单词表,那么就可以在添加新的单词时不用修改词法分析程序. 下面示例便利用符号表实现,即在词法分析程序运行时从输入文件中读 ...