Codeforces713D. Animals and Puzzle
$n<=1000,m<=1000$,$n*m$的01矩阵,给$t<=1000000$个询问,每次问一个矩形中最大的1正方形的边长。
先想想不考虑“一个矩形中”的限制,那记$f(i,j)$--以$(i,j)$为右下角的最大的正方形,那

很好,那现在加入一个边界限制,由于边长r的正方形同时也是边长r-1,r-2……的,那来二分答案吧,现在对二分的答案$x$就检查一个区域里的$f$数组中最大的那一个是否大于等于$x$。查静态区间最大,用ST表啦!拓展到二维情况即可。
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
//#include<math.h>
//#include<assert.h>
#include<algorithm>
//#include<iostream>
//#include<bitset>
using namespace std; int n,m,t;
#define maxn 1011
int a[maxn][maxn],Log[maxn];short rmq[maxn][maxn][][]; int x1,x2,y1,y2;
int rmqquery(int x1,int y1,int x2,int y2)
{
int p=Log[x2-x1+],q=Log[y2-y1+];
return max(max(rmq[x1][y1][p][q],rmq[x2-(<<p)+][y1][p][q])
,max(rmq[x1][y2-(<<q)+][p][q],rmq[x2-(<<p)+][y2-(<<q)+][p][q]));
}
bool check(int len) {return rmqquery(x1+len-,y1+len-,x2,y2)>=len;}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
scanf("%d",&a[i][j]);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
if (a[i][j]==) rmq[i][j][][]=;
else rmq[i][j][][]=min(rmq[i][j-][][],min(rmq[i-][j][][],rmq[i-][j-][][]))+;
Log[]=-; for (int i=,to=max(n,m);i<=to;i++) Log[i]=Log[i>>]+;
for (int q=;(<<q)<=m;q++)
for (int i=;i<=n;i++)
for (int j=,to=m-(<<q)+;j<=to;j++)
rmq[i][j][][q]=max(rmq[i][j][][q-],rmq[i][j+(<<(q-))][][q-]);
for (int p=;(<<p)<=n;p++)
{
for (int i=,to=n-(<<p)+;i<=to;i++)
for (int j=;j<=m;j++)
rmq[i][j][p][]=max(rmq[i][j][p-][],rmq[i+(<<(p-))][j][p-][]);
for (int q=;(<<q)<=m;q++)
for (int i=,to=n-(<<p)+;i<=to;i++)
for (int j=,to=m-(<<q)+;j<=to;j++)
rmq[i][j][p][q]=max(rmq[i][j][p][q-],rmq[i][j+(<<(q-))][p][q-]);
}
scanf("%d",&t);
while (t--)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int L=,R=min(x2-x1+,y2-y1+);
while (L<R)
{
const int mid=(L+R+)>>;
if (check(mid)) L=mid;
else R=mid-;
}
printf("%d\n",L);
}
return ;
}
Codeforces713D. Animals and Puzzle的更多相关文章
- Animals and Puzzle
Animals and Puzzle time limit per test 5 seconds memory limit per test 512 megabytes input standard ...
- 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 ...
- 【CodeForces】713 D. Animals and Puzzle 动态规划+二维ST表
[题目]D. Animals and Puzzle [题意]给定n*m的01矩阵,Q次询问某个子矩阵内的最大正方形全1子矩阵边长.n,m<=1000,Q<=10^6. [算法]动态规划DP ...
- 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 713D Animals and Puzzle(二维ST表+二分答案)
题目链接 Animals and Puzzle 题意 给出一个1e3 * 1e3的01矩阵,给出t个询问,每个询问形如x1,y1,x2,y2 你需要回答在以$(x1, y1)$为左上角,$(x1, ...
- Codeforces 713D Animals and Puzzle
题意:一个n*m的01矩阵,Q个询问,每次询问一个矩形区域内,最大的全1正方形的边长是多少? 题解:dp[0][0][i][j]表示以(i, j)为右下角的正方形的最长边长.RMQ后,二分答案即可. ...
- codeforces 713D D. Animals and Puzzle 二分+二维rmq
题目链接 给一个01矩阵, 然后每个询问给出两个坐标(x1, y1), (x2, y2). 问你这个范围内的最大全1正方形的边长是多少. 我们dp算出以i, j为右下角的正方形边长最大值. 然后用二维 ...
- BUPT2017 wintertraining(16) #9
龟速补题.目前基本弃坑.已暂时放弃 D.I 两题. 下面不再写题意了直接说解法注意事项之类,直接放contest链接. https://vjudge.net/contest/151537 A.The ...
- Puzzle 面向服务/切面(AOP/IOC)开发框架 For .Net
Puzzle 面向服务/切面AOP开发框架 For .Net AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效 ...
随机推荐
- Anaconda(miniconda)安装及使用--转
https://www.waitalone.cn/anaconda-install-error.html 3,224 1.Anaconda概述 Anaconda是一个用于科学计算的 ...
- Html标签杂记
<html> <head> <title> </title> </head> <body> </body> < ...
- 如何理解JavaScript的单线程
JS的本质是单线程的.这点区别于JAVA的两个线程并发 但是,平时的JS,确实是同时运行很多任务,这又是怎么回事???? First,js的代码分为两种.同步代码和异步代码. console.log( ...
- SQL Server调试存储过程
一. 调试SQL Server 2000 1. 设置帐户. <1> 在windows服务中找到MSSQLSERVER,双击弹出对话框. <2> 选择 ...
- VUE 入坑系列 一 基础语法
html代码 <div id="app"> {{message}} </div> JavaScript代码 var vm = new Vue({ el: & ...
- element ui 在vue中使用可能遇到的问题
组件使用参照官网http://element.eleme.io/#/zh-CN/component/quickstart 在 main.js 中写入以下内容: import Vue from 'vue ...
- win7 快捷键 收集
1. 轻松访问键盘快捷方式 按住右 Shift 八秒钟:启用和关闭筛选键 按左 Alt + 左 Shift + PrtScn (或 PrtScn):启用或关闭高对比度 按左 Alt + 左 Shift ...
- (转)Spring使用AspectJ进行AOP的开发:注解方式
http://blog.csdn.net/yerenyuan_pku/article/details/69790950 Spring使用AspectJ进行AOP的开发:注解方式 之前我已讲过Sprin ...
- 用Python控制摄像头拍照并发邮件
概述前言 工具 思路 安装及导入包 设置参数 实现拍照 构造邮件内容 发送邮件 判断网络连接 开机自启 后记 o1 前言为什么会有写这个程序的想法呢? 最初的想法是写一个可以用电脑前置摄像头拍照的程序 ...
- jdk5.0新增两个线程创建方法
1.实现callable接口 import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; ...