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.

Solution

  • 套路——扫描线+线段树。

  • 将一个矩形(横坐标 x1,x2x1,x2)拆成加入 x1x1 和 删除 x2+1x2+1 两部分。

  • 按横坐标排序,用两个指针 l,rl,r 扫,同时用线段树维护当前区间中的最大空位置长度。

  • 方法:区间维护最大长度,从左延伸最大长度、从右延伸最大长度……

  • 设最大空位置长度为 msms ,若 ms<r−l+1ms ,则让 ll 右移,否则 rr 右移即可。

  • 时间复杂度为 O(N log N)O(N\ log\ N) 。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
const int N=1e6+5;
struct data
{int x,y1,y2,z;
}a[N];
struct node
{int mx,l,r,c;
}f[N<<2];
int qx,qy,qz,ans,tot;
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline bool cmp(data x,data y)
{return x.x<y.x;
}
inline int max(int x,int y)
{return x>y?x:y;
}
inline int min(int x,int y)
{return x<y?x:y;
}
inline void update(int v,int l,int r)
{int ls=v<<1,rs=v<<1|1,mid=l+r>>1;f[v].l=f[ls].l,f[v].r=f[rs].r;if(f[ls].l==mid-l+1) f[v].l+=f[rs].l;if(f[rs].r==r-mid) f[v].r+=f[ls].r;f[v].mx=max(f[ls].mx,f[rs].mx);f[v].mx=max(f[v].mx,f[ls].r+f[rs].l);
}
void make(int v,int l,int r)
{f[v].mx=f[v].l=f[v].r=r-l+1;if(l==r) return;int mid=l+r>>1;make(v<<1,l,mid);make(v<<1|1,mid+1,r);
}
void change(int v,int l,int r)
{if(qx<=l && r<=qy){f[v].c+=qz;if(!f[v].c){if(l==r) f[v].mx=f[v].l=f[v].r=1; else update(v,l,r);}else f[v].mx=f[v].l=f[v].r=0;return;}int mid=l+r>>1;if(qx<=mid) change(v<<1,l,mid);if(qy>mid) change(v<<1|1,mid+1,r);if(!f[v].c) update(v,l,r); else f[v].mx=f[v].l=f[v].r=0;
}
int main()
{int n=read(),m=read(),p=read();for(int i=1;i<=p;i++){int x1=read(),y1=read(),x2=read(),y2=read();a[++tot].x=x1,a[tot].y1=y1,a[tot].y2=y2,a[tot].z=1;a[++tot].x=x2+1,a[tot].y1=y1,a[tot].y2=y2,a[tot].z=-1;}sort(a+1,a+1+tot,cmp);make(1,1,m);int l=1,r=1,nl=1,nr=1;while(a[nl].x==l){if(a[nl].z==-1){qx=a[nl].y1,qy=a[nl].y2,qz=a[nl].z;change(1,1,m);}nl++;}while(a[nr].x==r){if(a[nr].z==1){qx=a[nr].y1,qy=a[nr].y2,qz=a[nr].z;change(1,1,m);}nr++;}while(r<=n){ans=max(ans,min(f[1].mx,r-l+1));if(r-l+1<=f[1].mx){r++;while(a[nr].x==r){if(a[nr].z==1){qx=a[nr].y1,qy=a[nr].y2,qz=a[nr].z;change(1,1,m);}nr++;}}else{l++;while(a[nl].x==l){if(a[nl].z==-1){qx=a[nl].y1,qy=a[nl].y2,qz=a[nl].z;change(1,1,m);}nl++;}}}printf("%d",ans);return 0;
}

JZOJ 4238. 【五校联考5day2】纪念碑相关推荐

  1. jzoj 4240.【五校联考5day2】游行 主席树优化连边+支配树

    Description 恶梦是学校里面的学生会主席.他今天非常的兴奋,因为学校一年一度的学生节开始啦!! 在这次节日上总共有N个节目,并且总共也有N个舞台供大家表演.其中第i个节目的表演时间为第i个单 ...

  2. jzoj4240 [五校联考5day2]游行 拓扑排序+倍增lca+线段树优化建图

    Description 恶梦是学校里面的学生会主席.他今天非常的兴奋,因为学校一年一度的学生节开始啦!! 在这次节日上总共有N个节目,并且总共也有N个舞台供大家表演.其中第i个节目的表演时间为第i个单 ...

  3. 湖南长郡2021高考成绩查询时间,2021年湖南新高考六校、长郡十五校联考时间公布...

    2021年湖南新高考六校.长郡十五校联考时间公布 导读:距离2021年高考时间仅剩不到一百天,各个省份都的高三学子都进入紧张阶段.开始了各种模拟考试.2021届湖南省炎德英才大联考的考试时间也已经公布 ...

  4. 4246. 【五校联考6day2】san (Standard IO)

    4246. [五校联考6day2]san (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits D ...

  5. jzoj4230. 【五校联考4day1】淬炼神体(B组——Day3)

    jzoj4230. [五校联考4day1]淬炼神体 题目 Description 王仙女将你提供的答案填在<葵花宝典>上,突然,宝典发出耀眼的白光,一股强大的吸力瞬间将仙女吸入宝典中. 一 ...

  6. [jzoj 4246] 【五校联考6day2】san {spfa+dfs/spfa+拓扑排序+dp}

    题目 Description 小明经常去N 个地点,其中有些地点之间有直接的无向道路(共M 条这样的道路),可以直接互相到达,这些道路的长短不一.由于小明对这些道路都很熟悉,无论起点和终点在哪里,总能 ...

  7. jzoj 4246【五校联考6day2】san

    Description 小明经常去N 个地点,其中有些地点之间有直接的无向道路(共M 条这样的道路),可以直接互相到达,这些道路的长短不一.由于小明对这些道路都很熟悉,无论起点和终点在哪里,总能走最短 ...

  8. jzoj(senior)4208. 【五校联考1day1】线段树什么的最讨厌了

    题目链接 题解:反着搜,从[l,r]区间去拓展到其他四个区间[l,2r-l],l,2r-l+1,[2l-r-2,r]2l-r-1,r,然后dfs这四个区间就好啦! #include<cmath& ...

  9. [jzoj 4249] 【五校联考7day1】游戏 {贪心/斜率优化}

    题目 Description WYF从小就爱乱顶,但是顶是会造成位移的.他之前水平有限,每次只能顶出k的位移,也就是从一个整点顶到另一个整点上.我们现在将之简化到数轴上,即从 一个整点可以顶到与自己相 ...

最新文章

  1. 一个动作让全球震惊!百度Apollo就这样改写了全球智能驾驶格局
  2. 在JDK 6和JDK 7的substring()方法的区别?
  3. 搞怪菜鸟加入域全程图解[为企业部署Windows Server 2008系列十二]
  4. 谈谈surging引擎的tcp、http、ws协议和如何容器化部署
  5. 能ping通工作组计算机 无法访问,可以ping通不能访问共享,其他电脑可以访问
  6. Linux 内核 hlist_head,hlist_node
  7. y7000怎么刷电池固件_redmi(红米)AC2100,刷老毛子固件
  8. 鸿蒙有没有手机管家,鸿蒙2.0手机快了,华为EMUI 11透露关键信息
  9. VS2015 编译boost
  10. 更改计算机睡眠时间注册表,如何通过修改注册表开启/关闭系统休眠?
  11. css loader.net,css-loader style-loader原理探究
  12. 深度学习基础笔记——卷积神经网络概念及其计算方式
  13. 【毕业季·进击的技术er】大学生计算机毕业设计应该这样写
  14. 阿狸心形表白html,qq分组心形图案一颗心
  15. InnoDB的MVCC如何解决不可重复读和快照读的幻读,当前读用next-key解决幻读
  16. 使用极狐GitLab限制开发者使用CI/CD的权限,三种方案
  17. 学号 20175212童皓桢 《Java程序设计》第8周学习总结
  18. php和mysql_用php和mysql做登陆注册系统
  19. Python 中点法求积分
  20. C语言和Bash脚本实现身份证号码尾号验证

热门文章

  1. matlab中size、length、cell的用法
  2. 感受野receptive field个人理解
  3. 机器学习导论(张志华):多元高斯分布
  4. linux中系统调用和库函数的区别
  5. java 数据对_数据表与简单java类(一对多)
  6. 【Python】函数外定义变量并在函数内进行更新
  7. 【Leetcode】二分法左侧边界右侧边界模板
  8. 【算法】一个简单的K近邻(KNN)原理
  9. [云炬创业学笔记]第二章决定成为创业者测试5
  10. 斯坦福CS231n项目实战(一):k最近邻(kNN)分类算法