【CodeForces】713 D. Animals and Puzzle 动态规划+二维ST表
【题意】给定n*m的01矩阵,Q次询问某个子矩阵内的最大正方形全1子矩阵边长。n,m<=1000,Q<=10^6。
【算法】动态规划DP+二维ST表
【题解】设f[i][j]为以(i,j)为右下角的最大正方形全1子矩阵。
f[i][j]=min{ f[i-1][j-1] , f[i][j-1] , f[i-1][j] }+1
然后用二维ST表处理f[i][j]的子矩阵最小值。
对于每次询问,二分边长x,答案即子矩阵(x1+x-1,y1+x-1)~(x2,y2)的f最小值。
特别注意:若是ST表直接处理二维,需要先预处理[0][1]和[1][0]的情况(即只有一条边的情况)。比较推荐先处理每行后再处理列。
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
int read(){
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
const int maxn=;
int a[maxn][maxn],c[maxn][maxn][][],logs[maxn],n,m;
void ST(){
logs[]=-;for(int i=;i<=max(n,m);i++)logs[i]=logs[i>>]+;
for(int k=;(<<k)<=n;k++)for(int l=;(<<l)<=m;l++)if(k||l)
for(int i=;i+(<<k)-<=n;i++)for(int j=;j+(<<l)-<=m;j++){
if(!k){c[i][j][k][l]=max(c[i][j][k][l-],c[i][j+(<<(l-))][k][l-]);continue;}
if(!l){c[i][j][k][l]=max(c[i][j][k-][l],c[i+(<<(k-))][j][k-][l]);continue;}
int s=max(c[i][j][k-][l],c[i][j][k][l-]);
c[i][j][k][l]=max(c[i+(<<(k-))][j+(<<(l-))][k-][l-],s);
}
}
int query(int x1,int y1,int x2,int y2){
if(x2<x1||y2<y1)return -;
int k=logs[x2-x1+],l=logs[y2-y1+];
int s=max(c[x1][y1][k][l],c[x2-(<<k)+][y2-(<<l)+][k][l]);
int t=max(c[x2-(<<k)+][y1][k][l],c[x1][y2-(<<l)+][k][l]);
return max(s,t);
}
int main(){
n=read();m=read();
for(int i=;i<=n;i++)for(int j=;j<=m;j++){
a[i][j]=read();
if(a[i][j])c[i][j][][]=min(c[i-][j-][][],min(c[i-][j][][],c[i][j-][][]))+;
}
ST();
int T=read();
while(T--){
int x1=read(),y1=read(),x2=read(),y2=read();
int l=,r=min(x2-x1+,y2-y1+)+,mid;
while(l<r){
mid=(l+r)>>;
if(query(x1+mid-,y1+mid-,x2,y2)>=mid)l=mid+;else r=mid;
}
printf("%d\n",l-);
}
return ;
}
【CodeForces】713 D. Animals and Puzzle 动态规划+二维ST表的更多相关文章
- Codeforces 713D Animals and Puzzle(二维ST表+二分答案)
题目链接 Animals and Puzzle 题意 给出一个1e3 * 1e3的01矩阵,给出t个询问,每个询问形如x1,y1,x2,y2 你需要回答在以$(x1, y1)$为左上角,$(x1, ...
- codeforces 713D D. Animals and Puzzle 二分+二维rmq
题目链接 给一个01矩阵, 然后每个询问给出两个坐标(x1, y1), (x2, y2). 问你这个范围内的最大全1正方形的边长是多少. 我们dp算出以i, j为右下角的正方形边长最大值. 然后用二维 ...
- 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 二维ST表 + 二分
D - Animals and Puzzle #include<bits/stdc++.h> #define LL long long #define fi first #define s ...
- [总结] 二维ST表及其优化
二维 \(\mathcal{ST}\) 表,可以解决二维 \(\mathcal{RMQ}\) 问题.这里不能带修改,如果要修改,就需要二维线段树解决了. 上一道例题吧 ZOJ2859 类比一维 \(\ ...
随机推荐
- Swift-switch使用注意点
1.swift后面的()可以省略 2.case后面的额break可以省略 3.如果想产生case穿透使用fallthrough 4.case后面可以判断多个条件","分割 5.sw ...
- 【第二周】【作业五】Scrum 每日站会
1.首先来看一下什么是Scrum: Scrum是一种敏捷软件开发的方法学,用于迭代式增量软件开发过程.Scrum在英语是橄榄球运动中争球的意思. 虽然Scrum是为管理软件开发项目而开发的,它同样可以 ...
- memached实现tomcat的session共享
由于项目服务器用的阿里云的ECS,Memcached也采用的阿里云.多个tomcat集群的session都存储在一个云memcached中. 配置步骤如下: 一.tomcat增加memcached支持 ...
- mysql 慢查询,查询缓存,索引,备份,水平分割
1.开启慢查询 在mysql的配置文件my.ini最后增加如下命令 [mysqld]port=3306slow_query_log =1long_query_time = 1 2.查看慢查询记录 默认 ...
- p2 休眠模式
如有错误,忘请指出. 才入手p2.p2有全局休眠模式,和钢体体眠模式.钢体能控制 body.allowSleep world.NO_SLEEPING 不允许休眠world.BODY_SLEEPING ...
- php面试必知必会常见问题
1 说出常用的10个数组方法 我觉得数组比较最能体现PHP基础语法的一个数据结构了,下面给大家列一下常用的10个关于操作数组的函数 in_array(判断数组中是否有某个元素) implode(将数组 ...
- iOS开发--字典(NSDictionary)和JSON字符串(NSString)之间互转
iOS开发--字典(NSDictionary)和JSON字符串(NSString)之间互转 1. 字典转Json字符串 // 字典转json字符串方法 -(NSString *)convertToJs ...
- Importing/Indexing database (MySQL or SQL Server) in Solr using Data Import Handler--转载
原文地址:https://gist.github.com/maxivak/3e3ee1fca32f3949f052 Install Solr download and install Solr fro ...
- uva1391-Astronauts
宇航员执行任务,有三个任务ABC.把宇航员按照平均年龄分成新老两组,老宇航员可以去AC,新宇航员可以取BC.宇航员之间有不能共存关系,问是否有合法的分配方案. 分析 虽然有三个任务,但每个宇航员还是只 ...
- 【纪念】NOIP2018后记——也许是一个新的起点
如果你为了失去太阳而哭泣,那么你也将失去星星和月亮. —— 泰戈尔<飞鸟集> NOIP结束了,我挂了一道题……曾经在心中觉得怎么都不会考到的分数,就这么冷冷的出现在了我的成绩单上.的确是比 ...