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. django之请求方法

    Http1.0定义了三种请求方法:GET,POST和HEAD方法 Http1.1新增了五种请求方式:OPTIONS,PUT,DELETE,TRACE和CONNECT方法 ----get        ...

  2. Android中使用Apache common ftp进行下载文件

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/birdsaction/article/details/36379201 在Android使用ftp下 ...

  3. struts.xml中的结果类型与视图

    实际上在Struts2框架中,一个完整的结果视图配置文件应该是: ? 1 2 3 4 5 <action name="Action名称" class="Action ...

  4. [***]HZOI20190714 T2熟练剖分

    这题真的神仙,蒟弱表示看题解看不懂……std看了几个小时大概看懂,还有一些细节的东西没有思考. 最难受的是题解和std好像并不是同一个人写的……数组状态不一样……看了好久才看出来f也是前缀和. F[i ...

  5. WPS修订功能的使用

    WPS设置 设置用户名: 修改之后的效果:

  6. 列出display的值,说明他们的作用。position的值, relative和 absolute定位原点是?

    display的值: block 像块类型元素一样显示. none 像行内元素类型一样显示. inline-block 像行内元素一样显示, 但其内容像块类型元素一样显示. list-item 像块类 ...

  7. jq实现简单购物车增删功能

    https://www.cnblogs.com/sandraryan/ jq实现购物车功能 点击+- 增减数量,计算价格: 点击删除,删除当前行(商品) 点击- ,减到0 询问是否删除商品 点击全选 ...

  8. hdu 4146 Flip Game

    Flip Game Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  9. HDU 1114 完全背包问题

    题意:有一个存钱罐,空罐时的重量是e,满罐时的重量是f,现在有n种硬币,每一种有无限个,现在给出每一种硬币的价值p和重量w,问存钱罐中最少钱,输出最小钱,否则输出... 思路:变形的完全背包问题,只是 ...

  10. .net Framework 源代码 · ScrollViewer

    本文是分析 .net Framework 源代码的系列,主要告诉大家微软做 ScrollViewer 的思路,分析很简单. 看完本文,可以学会如何写一个 ScrollViewer ,如何定义一个 IS ...