树套树被QAQ用木斧挖了,只剩二维RMQ了。

题目:

     QAQ最近爱上了一款很平凡的游戏,叫做《Minecraft》。目前游戏更新到了1.12版本,他发现了一条新的指令:/fill x y z X Y Z……,在网络上搜索后,他了解到这条指令的意义是:将坐标为(x,y,z)和(X,Y,Z)两点为对角线的长方体赋值为一种方块。由于他想使用这个指令来建造正方形地板,所以他认为要把z坐标全设置为1,这样就只需要考虑x,y了。他正想用该指令的时候,发现了一个问题:如果他直接执行命令,可能会覆盖地上他的一些可爱的小花花,这是他不愿意的,所以总结来说,你要帮他在地上找到一块面积最大的正方形(输出边长即可),满足这个正方形不经过任何一朵小花花。

[输入描述]

    输入正整数n,m(1<=n,m<=1000)表示整个场地的大小。接下来输入一个n*m的矩阵,表示地面:1表示空地,0表示有小花花。然后输入询问个数q(q<=1000000),接下来输入q个询问,每个询问的格式为:(x1,y1,x2,y2)表示询问在以(x1,y1)和(x2,y2)为对角线的矩形中,不经过小花花(花在边上也算经过)的正方形中,边长最大的正方形的边长是多少。

[输出描述]

    输出q个正整数,表示q个询问的答案。

[输入样例]

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

·分析

      可以清晰的发现这是一个需要很多优化的题——因为一看题我们可以敏捷地想到使用二维前缀来维护边长最大矩形,然后依仗上述预处理暴力回答询问,最后发现严重超时。

      审视数据范围:n,m<=1000,q<=1000000。可以得到两个不太精确的信息:(1)预处理时间复杂度O(n*n),O(n*n*logn),O(n*n*logn*logn)可以支持(已经是极限了)。(2)对于每个询问必须O(1)或者O(logn)解决。

      先考虑怎样满足询问的时间限制,我们可以使用二维RMQ来达到要求(或者一时想不出来的神奇解法),但这只是猜想,毕竟还要看看预处理是否满足。

      对于预处理,我们根据上文的经验,原本使用了f[i][j]表示以点(i,j)为右下角的边长最大正方形的边长,其递推方程式容易写出:
    f[i][j]=a[i][j]?min{f[i][j-1],f[i-1][j],f[i-1][j-1]}+1:0

     (a[i][j]表示输入的地图)

     但是这样的预处理有局限性——我们的询问是对于一个二维区间内的正方形,可是单个f[i][j]是对于以(i,j)为右下角的正方形的,这样如果不加以修饰,那么对于一个询问,我们就只有暴力每一个点,即将每个点作为右下角进行一次取值,这样不幸超时。

     因此,我们需要保存一段二维区间的所有f[i][j]值,到时候回答时就可以直接使用了。为了维护一段二维区间的最值,我们首先想一想RMQ(树套树在询问的时候是O((logn)3),无力胜任),根据一维RMQ的思路:g[k][i]表示以i为终点,长度为2k的一段区间的最大值,来推广至二维RMQ:g[k1][k2][i][j]表示以(i,j)为右下角,以(i-2k1,j-2k2)为左上角的矩形内f的最大值。

     这样,我们的预处理时间复杂度为O(n*n*logn*logn)。询问时间复杂度看上去是O(1),但是还有一个小问题:

如图,红色的正方形不完全属于询问区间,本不能贡献答案,可是由于我们保存的是f[i][j](图中f[i][j]是以(i,j)为左上角的最大正方形边长),所以RMQ就会将其作为答案的考虑,这样输出结果为2,实际上是1,就WA了。

     上述问题产生的原因是一个合法正方形(即不覆经过小花花)的一部分在询问区间内(尤其是右下角,因为f[i][j]的定义这样的),就误将其作为答案考虑。为了避免这种情况,同时注意时间复杂度的保持,怎么做啊?

     首先给出方法:牺牲时间复杂度,使每个询问回答成为(logn),将分出来的logn拿给二分——二分答案,同时这个二分的结果还有一个限制作用,可以用于防止上文的正方形超界的情况,如一个图:

  我们将RMQ的询问区间缩小至A区间。那么就算是遇到了超界的情况,我们也不在意,我们只关注是否最大值大于M即可,举例如图:

     注意,我们现在找到的答案来自于A中所有的f的最大值,那么就可能会出现图中红色正方形的情况,但是,既然红色的大正方形成立(虽然它不在询问区间内),那么合法的G正方形则可以作为答案考虑,由于每次二分我们只需要判断是否能够找到边长为M的合法正方形,所以这样我们只需要找到的值大于等于M就可以在check函数中返回True了。本题二分的精髓就在这里完全展现了。

     另外的注意事项,对于询问A矩形的最值,RMQ怎样询问?当然要向一维(一个序列)那样分段考虑啊:

第二幅图有些凌乱,但只要结合一维区间RMQ的思路,二维无非是两两组合。RMQ之所以这样做的根本原因是其区间是固定的,是2k长度,然而我们询问区间是不定的,所以需要2k长度去拼接重叠才能达到要求。

     代码说:“我要来!”。

 #include<stdio.h>
#include<algorithm>
#define f g[0][0]
#define go(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;const int N=;
int n,m,g[][][N][N],K[<<],D[],q,x,y,X,Y,l,r,M,ans;
char Getchar()
{
static char s[],*p1=s,*p2=s;
if(p1==p2)p2=(p1=s)+fread(s,,,stdin);return *p1++;
}
void Judy(int &w)
{
int x=;w=;char c=;
while(c<''||c>''){if(c=='-')w=-;c=getchar();}
while(!(c<''||c>''))x=x*+c-'',c=getchar();w=x*w;
}
int find(int x1,int y1,int x2,int y2)
{
int k1=K[x2-x1+],k2=K[y2-y1+];return max(max(
g[k1][k2][x2][y2],
g[k1][k2][x1+D[k1]-][y1+D[k2]-]),max(
g[k1][k2][x1+D[k1]-][y2],
g[k1][k2][x2][y1+D[k2]-]));
}
int main()
{
freopen("square.in","r",stdin);
freopen("square.out","w",stdout);
Judy(n);Judy(m);D[]=;go(i,,){D[i]=D[i-]<<;
go(j,D[i-],D[i]-)K[j]=i-;} go(i,,n)go(j,,m)Judy(f[i][j]),f[i][j]?
f[i][j]=min(f[i-][j-],min(f[i][j-],f[i-][j]))+:;
go(k,,)go(i,D[k],n)go(j,,m)
g[k][][i][j]=max(g[k-][][i][j],g[k-][][i-D[k-]][j]);
go(k,,)go(i,,n)go(j,D[k],m)
g[][k][i][j]=max(g[][k-][i][j],g[][k-][i][j-D[k-]]);
go(k1,,)go(k2,,)go(i,D[k1],n)go(j,D[k2],m)
g[k1][k2][i][j]=max(g[k1][k2-][i][j],g[k1][k2-][i][j-D[k2-]]); Judy(q);
while(q--)
{
Judy(x);Judy(y);Judy(X);Judy(Y);ans=;
int l=,r=min(X-x+,Y-y+);
while(l<=r)M=l+r>>,find(x+M-,y+M-,X,Y)>=M?ans=M,l=M+:r=M-;
printf("%d\n",ans);
}
return ;
}//Paul_Guderian

路缓缓流向远方,旷野的天空云彩飞扬,

时光在房间里回荡,我坐着心在歌唱。————汪峰《生命中的一天》

【QAQ的Minecraft】的更多相关文章

  1. MineCraft note

    客户端:http://pan.baidu.com/s/1hqgS8sshttp://pan.baidu.com/s/1mgmkduC 材质包:R3D小地图MODCraftGuide mod 内置合成表 ...

  2. Ubuntu上安装Minecraft服务器

    Minecraft由于其独特的魅力吸引了很多玩家.不过游戏的乐趣只有在和朋友一起玩的时候才最有意思,所以很早以前我就想建设自己的服务器.但由于专业知识欠缺,没有实现. 最近接触了Linux服务器,所以 ...

  3. 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)

    写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...

  4. cojs QAQ的图论题 题解报告

    话说这个题目应该叫做 斯特林数的逆袭 QAQ 先说一说部分分的算法 1.n<=5 直接暴力搜索就可以了 2.k=0的时候不难发现任意一张图的价值都是n,问题转化为计算有多少种图,显然是2^C(n ...

  5. cojs QAQ的序列 解题报告

    QAQ 这是从论文上搬的一道题目 但是由于并没有找到题目地址,所以就自己造数据咯 发现数据无比难造 (本题数据极弱,暴力或可AC?) 我们考虑离线的话其实只需要莫队就可以了 那么在线怎么做呢 二进制分 ...

  6. QAQ OI生涯の最后一个月

    QAQ 总觉得自己要做点什么 可是并不知道去做些什么 QAQ 先挖一些坑吧,不管怎么样,把这些坑填完估计NOI也就无憾了 1.读完13-16的论文 QAQ 2.做完12-16的POI  QAQ 3.做 ...

  7. 纵观minecraft 游戏作者的世界观

    minecraft 这款游戏 独特的游戏背景 与 模式 深受我爱 ,游戏的音乐制作方面也是独具一格 但是 整个游戏的风气 充满孤独的色彩 抑郁惆怅的音乐 每当在日出时 响起 ,当你进入生存模式之后 开 ...

  8. QAQ高精度模板笔记√

    #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #i ...

  9. NVIDIA显卡设置提升MineCraft流畅度

    很喜欢MineCraft(我的世界)这款游戏.可09年Y450的配置现在看来有点弱,尽管将Y450的CPU升级至了2.8Ghz的T9600,内存升级至1066Mhz的4G双通道内存,硬盘更换为128G ...

随机推荐

  1. 使用 PuTTY 从 Windows 连接到 Linux 实例

    启动您的实例之后,您可以连接到该实例,然后像使用您面前的计算机一样来使用它. Note 启动实例后,需要几分钟准备好实例,以便您能连接到实例.检查您的实例是否通过了状态检查 - 您可以在 Instan ...

  2. Hibernate之Hibernate的体系结构

    体系结构简图: 这是一张体系结构的简图,其中的hibernate.properties文件的作用相当于配置文件hibernate.cfg.xml XML Mapping对应的就是映射文件 XXXX.h ...

  3. NOIP2012 提高组 Day 2

    http://www.cogs.pro/cogs/page/page.php?aid=16 期望得分:100+100+0=0 实际得分:100+20+0=120 T2线段树标记下传出错 T1 同余方程 ...

  4. 【非官方】Surging 微服务框架使用入门

    前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与Surging的RPC框架,在.NET 4.0框架 ...

  5. css3动画 一行字鼠标触发 hover 从左到右颜色渐变

    偶然的机会发现的这个东东 这几天做公司的官网 老板突然说出了一个外国网站 我就顺手搜了 并没有发现他说的高科技 但是一个东西深深地吸引了我 就是我下面要说的动画  这个好像不能放视频 我就简单的描述一 ...

  6. XML之自动生成类,添加,修改,删除类的属性

    1. class ClassHelperDemo { public static void Main() { #region 演示一:动态生成类. //生成一个类t. Type t = ClassHe ...

  7. JAVA_SE基础——34.static修饰成员变量

    需求:描述一下学校的学生.  特点:都是中国人.... 测试代码1: class Student{ String name; String country = "中国"; //国籍 ...

  8. Win10安装Ubuntu14.04.5双系统(显示器为DP接口)

    系统安装主要参考了这篇博文Win10+Ubuntu17.04双系统安装,不再重复. 重点说说DP接口的事,如果主机有VGA接口的话可以到此为止了,如果只有DP接口的话可以参考以下内容. 一.Ubunt ...

  9. python 判断变量是否是 None 的三种写法

    代码中经常会有变量是否为None的判断,有三种主要的写法:第一种是`if x is None`:第二种是 `if not x:`:第三种是`if not x is None`(这句这样理解更清晰`if ...

  10. Python-基础学习-Day1

    1 Python介绍 1.1 Python 是一门什么样的语言? python是一门动态解释性的强类型定义语言. 编译型的特点:可一致性差,运行速度快. 解释型的特点:边执行边解释,速度慢 1.2 P ...