题目描述

输入

输出

样例输入

3 4

1 1 0 1

0 1 1 0

0 1 1 0

5

1 1 2 3

2 1 3 2

3 2 3 4

1 1 3 4

1 2 3 4

样例输出

1

1

1

2

2

数据范围

解法

设f[i][j]为以(i,j)为右下角的正方形的最大边长。

则f[i][j]=min(f[i−1][j],f[i−1][j−1],f[i][j−1])+1(a[i][j]=1)


考虑利用f来求答案。

对于询问(x1,y1,x2,y2):

显然ans=min(f[x][y],x−x1+1,y−y1+1)

二分答案mid,如果矩阵(x1+mid-1,y1+mid-1,x2,y2)的f最大值大于或等于mid,那么mid合法。


静态子矩阵求最大值,考虑使用二维RMQ。


总的时间复杂度为O(T∗log(n2))。

代码

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#define ll long long
#define ln(x,y) int(log(x)/log(y))
#define sqr(x) ((x)*(x))
using namespace std;
const char* fin="square.in";
const char* fout="square.out";
const int inf=0x7fffffff;
const int maxn=1007,maxk=10;
int n,m,t,i,j,k,l,lef,mid,rig;
int f[maxn][maxn],g[maxk][maxk][maxn][maxn];
int getmax(int sx,int sy,int tx,int ty){
int i=0,j=0;
while (sx+(1<<(i+1))-1<=tx) i++;
while (sy+(1<<(j+1))-1<=ty) j++;
return max(max(g[i][j][sx][sy],g[i][j][tx-(1<<i)+1][sy]),max(g[i][j][sx][ty-(1<<j)+1],g[i][j][tx-(1<<i)+1][ty-(1<<j)+1]));
}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++){
for (j=1;j<=m;j++){
scanf("%d",&k);
if (k) f[i][j]=min(f[i][j-1],min(f[i-1][j-1],f[i-1][j]))+1;
else f[i][j]=0;
g[0][0][i][j]=f[i][j];
}
}
for (i=0;(1<<i)<=n;i++){
for (j=0;(1<<j)<=m;j++){
if (i==0 && j==0) continue;
for (k=1;k+(1<<i)-1<=n;k++)
for (l=1;l+(1<<j)-1<=m;l++){
if (j==0) g[i][j][k][l]=max(g[i-1][j][k][l],g[i-1][j][k+(1<<(i-1))][l]);
else g[i][j][k][l]=max(g[i][j-1][k][l],g[i][j-1][k][l+(1<<(j-1))]);
}
}
}
scanf("%d",&t);
for (;t;t--){
scanf("%d%d%d%d",&i,&j,&k,&l);
if (getmax(i,j,k,l)==0) printf("0\n");
else {
lef=1;
rig=min(k-i+1,l-j+1);
int l1=lef,r1=rig;
while (lef<rig){
mid=(lef+rig)/2;
if (getmax(i+mid-1,j+mid-1,k,l)>=mid) lef=mid;
else rig=mid-1;
if (l1==lef && r1==rig) break;
else l1=lef,r1=rig;
}
if (getmax(i+rig-1,j+rig-1,k,l)>=rig) lef=rig;
printf("%d\n",lef);
}
}
return 0;
}

启发

静态子矩阵求和可以使用RMQ。


这类型(无修改离线多次询问)的问题可以这样考虑:

1.由询问次数决定时间复杂度;

2.考虑一次询问如何在规定复杂度内求出答案。

3.考虑预处理在2中所需要的信息。


这题类似于妮厨的愤怒,那样处理三元取最值。

【JZOJ4817】【NOIP2016提高A组五校联考4】square的更多相关文章

  1. NOIP2016提高A组五校联考4总结

    坑爹的第一题,我居然想了足足3个小时,而且还不确定是否正确. 于是,我就在这种情况下心惊胆跳的打了,好在ac了,否则就爆零了. 第二题,树形dp,本来差点就想到了正解,结果时间不够,没打完. 第三题, ...

  2. 【NOIP2016提高A组五校联考4】square

    题目 分析 首先,设\(f_{i,j}\)表示最大的以(i,j)为左下角的正方形的边长. 转移显然,\(f_{i,j}=\max(f_{i-1,j},f_{i,j-1},f_{i-1,j-1})+1\ ...

  3. 【NOIP2016提高A组五校联考4】label

    题目 题目 20%算法 设\(f_{i,j}\)表示第i个节点选了j这个权值的方案数. 显然转移方程为,\[f_{i,j}=\Pi_{v=son(i)}(\sum_{k=1}^{j-k}f_{v,k} ...

  4. 【NOIP2016提高A组五校联考4】ksum

    题目 分析 发现,当子段[l,r]被取了出来,那么[l-1,r].[l,r+1]一定也被取了出来. 那么,首先将[1,n]放入大顶堆,每次将堆顶的子段[l,r]取出来,因为它是堆顶,所以一定是最大的子 ...

  5. NOIP2016提高A组五校联考3总结

    第一题,本来一开始就想到了数位dp,结果脑残地打了十几个转移方程,总是调试不出来,一气之下放弃了. 调第一题几乎调了整节比赛,第二第三都没它. 第二题连边找联通块. 第三题题解都打了三页,看都不想看. ...

  6. 【NOIP2016提高A组五校联考2】tree

    题目 给一棵n 个结点的有根树,结点由1 到n 标号,根结点的标号为1.每个结点上有一个物品,第i 个结点上的物品价值为vi. 你需要从所有结点中选出若干个结点,使得对于任意一个被选中的结点,其到根的 ...

  7. 【NOIP2016提高A组五校联考2】running

    题目 小胡同学是个热爱运动的好孩子. 每天晚上,小胡都会去操场上跑步,学校的操场可以看成一个由n个格子排成的一个环形,格子按照顺时针顺序从0 到n- 1 标号. 小胡观察到有m 个同学在跑步,最开始每 ...

  8. 【NOIP2016提高A组五校联考2】string

    题目 给出一个长度为n, 由小写英文字母组成的字符串S, 求在所有由小写英文字母组成且长度为n 且恰好有k 位与S 不同的字符串中,给定字符串T 按照字典序排在第几位. 由于答案可能很大,模10^9 ...

  9. NOIP2016提高A组五校联考2总结

    第一题用组合数各种乱搞,其恶心程度不一般.搞了很久才调对,比赛上出了一点bug,只拿了30分. 第二题我乱搞得出个错误的结论,本来自信满满60分,结果爆零了. 第三题,树形dp,在一开始的时候想到了, ...

随机推荐

  1. [转载] OpenCV2.4.3 CheatSheet学习(一)

    OpenCV向MATLAB靠拢,图像的操作方法变得不那么C了,更m了一些.比如,MATLAB中的常用函数imshow.imread.imwrite函数在OpenCV中已经有了同名的兄弟. 此外,Ope ...

  2. go modules

    go modules官方资料:https://github.com/golang/go/wiki/Modules go版本控制发展史: Go 1.5 Release之前 使用GOPATH,包管理.项目 ...

  3. KOA 学习(四)

    响应(Response) Koa Response 对象是对 node 的 response 进一步抽象和封装,提供了日常 HTTP 服务器开发中一些有用的功能. response.header Re ...

  4. FTP主动模式与被动模式说明

    FTP是仅基于TCP的服务,不支持UDP.与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口).通常来说这两个端口是21(命令端口)和20(数据端口).但FTP工作方式的不同 ...

  5. python 字符串的处理技巧--join

    >>> '+'.join('1234')'1+2+3+4'>>> '+'.join(a for a in '1234')'1+2+3+4'>>> ...

  6. 通过ajax从jsp页面传输数据到web层,并从web层返回数据给jsp页面

    jsp中ajax代码: 1 $.ajax({ var id = $("#studentid").val();//获取标签中的学生id url:'${pageContext.requ ...

  7. Git--版本管理的使用及理解

    如果多人合作时,git也是需要中间交换服务器来解决冲突合并,这不还是集中式版本控制吗? 而svn不是也可以将所有源码下载到本机,然后在本机修改,保存在本机上,为什么这个不能说是分布式,提交的时候不也是 ...

  8. 采坑“微信小程序”

    1.微信小程序变量定义时中间不能使用 “-”. 2.padding值不能为负.

  9. Java方法传参的问题

    1.基本数据类型(byte,short,int,long,float,double,boolean,char)的值传递,不改变其值 2.引用数据类型的值传递,改变其值 3.String类型虽然是引用数 ...

  10. oracle创建定时任务

    一.dmbs_job dbms_job涉及到的知识点 1.创建job: variable jobno number; dbms_job.submit(:jobno, —-job号  'your_pro ...