Poj

$Description$

在一个二维平面上,有$N$颗草,每颗草的大小是$1*1$,左下角坐标为$x_i,y_i$.要求一个正方形,正方形的边平行于$x$或$y$轴,正方形里面包含至少$C$颗草.求正方形的最小边长.注意,同一个区域可能生长多颗草.

数组范围:$1<=N,C<=500\ 1<=x_i,y_i<=10000$

$Sol$

最简单暴力的方法当然就是枚举正方形的一个顶点,就定为左上顶点叭,然后再从小到大枚举边长,然后$check()$,更新答案.显然这个方法复杂度爆炸$qwq$,而且,$check()$要用到二位前缀和,而根据$x,y$的范围,这根本就存不下.

1.虽然$x,y$的范围很大,但是$N$只有$500$鸭,所以就离散化!

2.发现合法的边长是单调的.如果当前边长可以,那么更大的显然也可以,所以二分就好了.

觉得这里的离散化好妙.jpg

特别要注意$lowerbound()$和$upperbound()$的区别吖!

$Code$

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
#define il inline
#define Rg register
#define go(i,a,b) for(Rg int i=a;i<=b;++i)
#define yes(i,a,b) for(Rg int i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define db double
using namespace std;
il int read()
{
Rg int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
const int N=;
int n,c,as,b[N*],ct,sum[N*][N*];
struct node{int x,y;}a[];
il bool ck(int qvq)
{
if(qvq>=b[ct])return ;
Rg int ovo=upper_bound(b+,b+ct+,b[ct]-qvq+)-b-;
go(i,,ovo)
go(j,,ovo)
{
Rg int x=upper_bound(b+,b+ct+,b[i]+qvq-)-b-,y=upper_bound(b+,b+ct+,b[j]+qvq-)-b-;
if(sum[x][y]-sum[i-][y]-sum[x][j-]+sum[i-][j-]>=c)return ;
}
return ;
}
int main()
{
c=read(),n=read();
go(i,,n)a[i].x=read(),a[i].y=read(),b[++ct]=a[i].x,b[++ct]=a[i].y;
sort(b+,b+ct+);ct=unique(b+,b+ct+)-(b+);b[++ct]=;
go(i,,n)
{
Rg int x=lower_bound(b+,b+ct+,a[i].x)-b,y=lower_bound(b+,b+ct+,a[i].y)-b;
sum[x][y]++;
}
go(i,,ct)go(j,,ct)sum[i][j]+=sum[i-][j]+sum[i][j-]-sum[i-][j-];
Rg int l=,r=,mid;
while(l<=r)
{
mid=(l+r)>>;
if(ck(mid))as=mid,r=mid-;
else l=mid+;
}
printf("%d\n",as);
return ;
}

随机推荐

  1. Navicat连接MySQL8.0版本时 建议升级连接客户端这个提示怎么办

    开始->mysql 8.0 command line client ->执行下面的命令//开启mysql服务mysql.server start//进入mysqlmysql -u root ...

  2. LeetCode73 Set Matrix Zeroes

    题目: Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.(Me ...

  3. 17-2 orm单表操作和多表操作

    参考:https://www.cnblogs.com/liwenzhou/p/8660826.html 一  ORM单表操作 1 增删改查 1. 查询 1. 查所有 models.Publisher. ...

  4. Android 高仿微信(QQ)滑动弹出编辑、删除菜单效果,增加下拉刷新功能

    不可否认,微信.QQ列表的滑动删除.编辑功能着实很经典(从IOS那边模仿过来的),然.Android这边,对列表的操作,其实大多还停留上下文菜单来实现. Android如何实现list item的滑动 ...

  5. mysql数据库之linux版本

    http://repo.mysql.com/yum/mysql-5.6-community/ 安装                                                    ...

  6. selenium webdriver学习(四)------------定位页面元素(转)

    selenium webdriver学习(四)------------定位页面元素 博客分类: Selenium-webdriver seleniumwebdriver定位页面元素findElemen ...

  7. SCSS语法格式及编译调试

    一.SASS编译 Sass 的编译有多种方法: 命令编译 GUI工具编译 自动化编译 1.1 命令编译 1)单文件编译 sass <要编译的Sass文件路径>/style.scss:< ...

  8. H3C 10BASE-T线缆和接口

  9. 手机QQ浏览器属于代理服务器吗?

    这两天.上QQ,会员上线提示.老是显示福建省,而没有具体的地方.这是怎么回事呢?而且那个时间段我都没有上QQ.但是有用手机QQ浏览器.偷菜.这是怎么回事,机子也没有病毒 没有木马 到底怎么搞的...! ...

  10. HDU 1251 裸的字典树、入门题

    裸的字典树还是挺简单的. 四个基本操作建立.查找.插入.删除 建立新结点我是用的c++中 new操作.当然也可以用malloc,都方便 不过指针阿.地址阿.这其中关系什么的我貌似还不是很清楚阿. 因为 ...