题目链接

给一个01矩阵, 然后每个询问给出两个坐标(x1, y1), (x2, y2)。 问你这个范围内的最大全1正方形的边长是多少。

我们dp算出以i, j为右下角的正方形边长最大值。 然后用二维st表预处理出所有的最大值。 对于每个询问, 我们二分一个值mid, 查询(x1 + mid -1, y1 + mid -1), (x2, y2)这个范围内的最大值是否大于mid 。如果大于的话就说明在(x1, y1), (x2, y2)范围内存在一个边长为mid的正方形。

#include <bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<1|1
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, n, a) for(int i = a; i<n; i++)
#define fi first
#define se second
typedef complex <double> cmx;
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-;
const int mod = 1e9+;
const int inf = ;
const int dir[][] = { {-, }, {, }, {, -}, {, } };
int dp[][][][], mm[];
void initRmq(int n, int m)
{
mm[] = -;
for(int i = ; i <= max(n, m); i++) {
mm[i] = ((i&(i-)) == ) ? mm[i-] + : mm[i-];
}
for (int ii = ; ii <= mm[n]; ii ++) {
for (int jj = ; jj <= mm[m]; jj ++) {
if (ii + jj) {
for (int i = ; i + (<<ii) - <= n; i ++) {
for(int j = ; j + (<<jj) - <= m; j ++) {
if (ii) {
dp[i][j][ii][jj] = max(dp[i][j][ii-][jj], dp[i+(<<(ii-))][j][ii-][jj]);
} else {
dp[i][j][ii][jj] = max(dp[i][j][ii][jj-], dp[i][j+(<<(jj-))][ii][jj-]);
}
}
}
}
}
}
}
int rmq(int x1, int y1, int x2, int y2)
{
int k1 = mm[x2-x1+];
int k2 = mm[y2-y1+];
x2 = x2 - (<<k1) + ;
y2 = y2 - (<<k2) + ;
return max(max(dp[x1][y1][k1][k2], dp[x1][y2][k1][k2]), max((dp[x2][y1][k1][k2]), dp[x2][y2][k1][k2]));
}
int main()
{
int n, m, x, q, x1, y1, x2, y2;
cin>>n>>m;
for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
scanf("%d", &x);
if (x)
dp[i][j][][] = min(min(dp[i-][j][][], dp[i][j-][][]), dp[i-][j-][][]) + ;
}
}
initRmq(n, m);
cin>>q;
while (q--) {
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
int l = , r = min(x2 - x1, y2 - y1) + ;
int ans;
while (l <= r) {
int mid = l + r >> ;
if (rmq(x1 + mid - , y1 + mid - , x2, y2) >= mid) {
ans = mid;
l = mid + ;
} else {
r = mid - ;
}
}
printf("%d\n", ans);
}
return ;
}

codeforces 713D D. Animals and Puzzle 二分+二维rmq的更多相关文章

  1. Codeforces 713D Animals and Puzzle(二维ST表+二分答案)

    题目链接 Animals and Puzzle 题意  给出一个1e3 * 1e3的01矩阵,给出t个询问,每个询问形如x1,y1,x2,y2 你需要回答在以$(x1, y1)$为左上角,$(x1, ...

  2. 【CodeForces】713 D. Animals and Puzzle 动态规划+二维ST表

    [题目]D. Animals and Puzzle [题意]给定n*m的01矩阵,Q次询问某个子矩阵内的最大正方形全1子矩阵边长.n,m<=1000,Q<=10^6. [算法]动态规划DP ...

  3. Codeforces Round #619 (Div. 2)E思维+二维RMQ

    题:https://codeforces.com/contest/1301/problem/E 题意:给个n*m的图形,q个询问,每次询问问询问区间最大的合法logo的面积是多少 分析:由于logo是 ...

  4. [BZOJ2738]矩阵乘法(整体二分+二维树状数组)

    整体二分+二维树状数组. 好题啊!写了一个来小时. 一看这道题,主席树不会搞,只能用离线的做法了. 整体二分真是个好东西,啥都可以搞,尤其是区间第 \(k\) 大这种东西. 我们二分答案,然后用二维树 ...

  5. 【bzoj2738】矩阵乘法 整体二分+二维树状数组

    题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5个数 ...

  6. 牛客 - 700I - Matrix Again - 二维RMQ - 二分

    https://ac.nowcoder.com/acm/contest/700/I 二维RMQ,贴个板子,注意爆内存,用char就可以了,char也可以存负数. 然后二分枚举对角线长度,理由很简单. ...

  7. hdu2888 二维RMQ

    Check Corners Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  8. hduacm 2888 ----二维rmq

    http://acm.hdu.edu.cn/showproblem.php?pid=2888 模板题  直接用二维rmq 读入数据时比较坑爹  cin 会超时 #include <cstdio& ...

  9. hdu 2888 二维RMQ模板题

    Check Corners Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

随机推荐

  1. OER 7451 in Load Indicator : Error Code = OSD-04500:指定了非法选项

    alert 日志错误OER 7451 in Load Indicator : Error Code = OSD-04500:指定了非法选项 Sun Apr 22 11:15:51 2012 OER 7 ...

  2. 10--动作系统(四)动作类中的reverse方法

    上一篇文章在使用持续动作过程中遇到不少问题,以获取动作类的反系动作尤为突出.所以今天把动作类找了个遍,先将大部分动作类是否实现reverse方法总结如下: T表示实现F表示没有实现. 观察可以发现带T ...

  3. FTP进行上传下载文件

    1.需要引入外部jar包:commons-net-2.0.jar(或者是子包commons-net-ftp-2.0.jar) 2.需下载ftp服务器 3. 本地电脑访问ftp服务器格式:ftp://用 ...

  4. LaTeX使用titlesec宏包改变章节编号形式的方法

    1.titleformat宏包命令详解 LaTeX中可以用titlesec宏包中的titleformat命令来改变标题形式: 导入宏包: \usepackage{titlesec} 改变标题的代码如下 ...

  5. Mac Outlook数据文件的位置

    ****/Documents/Microsoft User Data/Office 2011 Identities/Main Identity 在这里 如果是中文版的,在这里: /Users/×××× ...

  6. 关于Redis的一些常识

    http://blog.csdn.net/mengxianhua/article/details/8961713 关于Redis的一些常识 2013-05-22 18:00 13315人阅读 评论(0 ...

  7. 【转】GCC警告选项例解 -- 不错

    原文网址:http://blog.csdn.net/hcx25909/article/details/7383716 程序员是追求完美的一族,即使是一般的程序员大多也都不想看到自己的程序中有甚至那么一 ...

  8. UESTC_秋实大哥与妹纸 2015 UESTC Training for Data Structures<Problem F>

    F - 秋实大哥与妹纸 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 1500/1500KB (Java/Others) Submit ...

  9. VS2015 MVC5项目部署

    刚看到一个年初的一个帖子说VS2015新建的MVC5项目部署后报错,自己捣鼓了一下,发现是Roslyn编译器的错误,简单处理后运行成功,分享如下: 新建一个MVC5的项目,保持不要动,执行以下几个步骤 ...

  10. debian msyql 5.1 卸载与安装

    卸载:apt-get autoremove --purge mysql-server-5.1 卸载服务端 apt-get remove mysql-common #一定要卸载(包含配置文件) dpkg ...