Description

2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址.

纪念中学的土地可以看作是一个长为n,宽为m的矩形.它由n* m个1*1的正方形组成,其中左下角的正方形的坐标为(1,1),右上角的正方形的坐标为(n, m).其中有一些土地已经被用来修建建筑物,每一幢建筑物都可以看做是一个左下角为(x1,y1),右上角为(x2,y2)的矩形.

纪念碑可以看作是一个正方形.校方希望你找出一块最大的正方形区域供他们参考.

Input

每一组数据的第一行包含三个整数n,m和p,分别表示学校的长,宽以及建筑物的数量.

接下来的p行,每行包含四个整数x1,y1,x2,y2,分别表示每一幢建筑物左下角以及右上角的坐标.

Output

输出一个数,表示可能的最大边长.

Sample Input

13 5 8

8 4 10 4

4 3 4 4

10 2 12 2

8 2 8 4

2 4 6 4

10 3 10 4

12 3 12 4

2 2 4 2

Sample Output

3

Data Constraint

对于30%的数据,p<=1000.

对于70%的数据,p<=30000.

对于100%的数据,p<=400000,m,n<=1000000.

分析:

如果我们确定了上下界,那么左右界最大就可以用线段树维护

设mx为整个区间最长空段,lmx为左端点出发最长空段,rmx为右端点出发最长空段

这三个值可以进行懒标记维护并向上递推

上下界考虑扫描线

目前上下界为L和R,最长左右界为S

考虑拓宽R,如果R-L+1>=S,则可以拓宽R

否则便缩小L,帮助拓宽R

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector> #define maxn 1000005
#define pii pair<int,int>
#define mp make_pair using namespace std; inline int getint()
{
int num=0,flag=1;char c;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
return num*flag;
} int n,m;
int len[maxn<<2],lmx[maxn<<2],rmx[maxn<<2],mx[maxn<<2],lz[maxn<<2];
vector<pii>l[maxn],r[maxn];
int ans; inline void pushup(int i)
{
mx[i]=max(max(mx[i<<1],mx[i<<1|1]),rmx[i<<1]+lmx[i<<1|1]);
lmx[i]=(lmx[i<<1]==len[i<<1]?len[i<<1]+lmx[i<<1|1]:lmx[i<<1]);
rmx[i]=(rmx[i<<1|1]==len[i<<1|1]?len[i<<1|1]+rmx[i<<1]:rmx[i<<1|1]);
} inline void work(int i,int x){mx[i]=lmx[i]=rmx[i]=x;} inline void pushdown(int i)
{
if(lz[i])
{
if(~lz[i])lz[i<<1|1]=lz[i<<1]=lz[i],work(i<<1,0),work(i<<1|1,0);
else lz[i<<1|1]=lz[i<<1]=lz[i],work(i<<1,len[i<<1]),work(i<<1|1,len[i<<1|1]);
lz[i]=0;
}
} inline void build(int i,int l,int r)
{
mx[i]=lmx[i]=rmx[i]=len[i]=r-l+1;
if(l==r)return;
int mid=(l+r)>>1;
build(i<<1,l,mid),build(i<<1|1,mid+1,r);
} inline void update(int i,int l,int r,int ql,int qr,int op)
{
if(qr<l||r<ql)return;
if(ql<=l&&r<=qr)
{
if(~op)work(i,0),lz[i]=op;
else work(i,len[i]),lz[i]=op;
return;
}
pushdown(i);
int mid=(l+r)>>1;
update(i<<1,l,mid,ql,qr,op),update(i<<1|1,mid+1,r,ql,qr,op);
pushup(i);
} int main()
{
n=getint(),m=getint();int tmp=getint();
while(tmp--)
{
int x1=getint(),y1=getint(),x2=getint(),y2=getint();
l[x1].push_back(mp(y1,y2)),r[x2].push_back(mp(y1,y2));
}
build(1,1,m);
int L=1;
for(int R=1;R<=n;R++)
{
for(int i=0;i<l[R].size();i++)update(1,1,m,l[R][i].first,l[R][i].second,1);
ans=max(ans,min(mx[1],R-L+1));
while(R-L+1>mx[1])
{
for(int i=0;i<r[L].size();i++)update(1,1,m,r[L][i].first,r[L][i].second,-1);
L++;
}
}
printf("%d\n",ans);
}

JZOJ4238 纪念碑的更多相关文章

  1. 「题解」「JZOJ-4238」纪念碑

    题目 在 \(N\times M\) 的网格中,有 \(P\) 个矩形建筑,求一个最大边长的正方形,使得网格中能找到一个放置正方形的地方,不会与建筑重合. 保证 \(N,M\le 10^6,P\le ...

  2. 2018.06.26 NOIP模拟 纪念碑(线段树+扫描线)

    题解: 题目背景 SOURCE:NOIP2015−GDZSJNZXSOURCE:NOIP2015-GDZSJNZXSOURCE:NOIP2015−GDZSJNZX(难) 题目描述 2034203420 ...

  3. 【2018.06.26NOIP模拟】T1纪念碑square 【线段树】*

    [2018.06.26NOIP模拟]T1纪念碑square 题目描述 2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址. 纪念中学的土地可以看作是一 ...

  4. 《纪念碑谷》(Monument Valley) 系列游戏的空间结构是如何设计的?

    这个游戏有着像埃舍尔的画一样有着空间结构的矛盾,如果是2D游戏,艾达可以行走的路线.建筑结构变化的过程是如何绘制的?如果是3D游戏,那么如何对这种违背物理定律的矛盾空间进行建模?以前有一个叫“无限回廊 ...

  5. 相关query挖掘

    1.何为相关query 我通常也把相关query称为相似query,搜索日志中一个用户在短时间内的一系列搜索词被称为相关query.相关就是两个query间有一定的关系,反映了用户在当时的需求.本文就 ...

  6. BZOJ 4568 幸运数字

    题目传送门 4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MB Description A 国共有 n 座城市,这些城市由 n-1 ...

  7. words

    conscious[英][ˈkɒnʃəs][美][ˈkɑnʃəs]consensus[英][kənˈsensəs][美][kənˈsɛnsəs] scious sensuswaterflood; de ...

  8. 【英语魔法俱乐部——读书笔记】 3 高级句型-简化从句&倒装句(Reduced Clauses、Inverted Sentences) 【完结】

    [英语魔法俱乐部——读书笔记] 3 高级句型-简化从句&倒装句(Reduced Clauses.Inverted Sentences):(3.1)从属从句简化的通则.(3.2)形容词从句简化. ...

  9. 【BZOJ-4568】幸运数字 树链剖分 + 线性基合并

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 238  Solved: 113[Submit][Status ...

随机推荐

  1. Next.js 笔记

    NEXT 中文文档地址! next.js 只有服务端使用的包需要做单独处理,无需打包到项目中,可以使用@zeit/next-bundle-analyzer观察代码. Router.beforePopS ...

  2. UVA - 11475 Extend to Palindrome (后缀数组)

    Your task is, given an integer N, to make a palidrome (word that reads the same when you reverse it) ...

  3. 魅族--魅蓝metal

      评论:金属潮流平民化

  4. 深入谷歌和甲骨文旷日持久的版权战争,趣味科普当前最火的编程语言JAVA的前世今生

    这篇文章是我在B站上投稿的一个科普java的视频文案,内容如标题,感兴趣的码农朋友可以移步观看https://www.bilibili.com/video/av81171108/ 在过去短短几十年间, ...

  5. 从头学pytorch(七):dropout防止过拟合

    上一篇讲了防止过拟合的一种方式,权重衰减,也即在loss上加上一部分\(\frac{\lambda}{2n} \|\boldsymbol{w}\|^2\),从而使得w不至于过大,即不过分偏向某个特征. ...

  6. 使用 Postman 测试你的 API

    使用 Postman 测试你的 API Intro 最近想对 API 做一些自动化测试,看了几个工具,最后选择了 postman,感觉 postman 的设计更好一些,我们可以在请求发送之前和请求获取 ...

  7. 一文详解滑动平均法、滑动平均模型法(Moving average,MA)

    任何关于算法.编程.AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI.算法.编程和大数据知识分享,以及免费的SSR节点和 ...

  8. JAVA8学习——深入Comparator&Collector(学习过程)

    深入Comparator&Collector 从源码深入Comparator Comparator从Java1.2就出来了,但是在1.8的时候,又添加了大量的默认方法. compare() e ...

  9. 10_时间戳timeStamp 和 时间 time 转换, 根据时间节点倒计时

    1: 时间戳 timeStamp 获取的几种方法及其优劣, 第一种只能精确到秒, 故不推荐使用, 最最常用的也是最官方的是第三种, 通过原型方法进行调用获取精确到毫秒数 : var timestamp ...

  10. Spring Boot2.X整合消息中间件RabbitMQ原理简浅探析

    目录 1.简单概述RabbitMQ重要作用 2.简单概述RabbitMQ重要概念 3.Spring Boot整合RabbitMQ 前言 RabbitMQ是一个消息队列,主要是用来实现应用程序的异步和解 ...