1052

思路:

  二分答案;

  二分可能的长度;

  然后递归判断长度是否可行;

  先求出刚好覆盖所有点的矩形;

  可行的第一个正方形在矩形的一个角上;

  枚举四个角上的正方形,然后删去点;

  删去一个正方形后,递归求出删去一个正方形后的矩形;

  往复三次,判断三次删点能否全部删光;

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 20005
#define INF 0x7ffffff int n,maxnlen=,upx,upy,downx,downy;
int aix[maxn],aiy[maxn],maxlen,if_[maxn]; inline void in(int &now)
{
int if_z=;now=;
char Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
now*=if_z;
} bool thcheck(int len)
{
int upx_=INF,upy_=-INF,downx_=-INF,downy_=INF;
for(int i=;i<=n;i++)
{
if(if_[i]==||if_[i]==) continue;
if(aix[i]<upx_) upx_=aix[i];
if(aiy[i]>upy_) upy_=aiy[i];
if(aix[i]>downx_) downx_=aix[i];
if(aiy[i]<downy_) downy_=aiy[i];
}
if(max(downx_-upx_,upy_-downy_)<=len) return true;
else return false;
} bool secheck(int len)
{
int upx_=INF,upy_=-INF,downx_=-INF,downy_=INF;
for(int i=;i<=n;i++)
{
if(if_[i]==) continue;
if(aix[i]<upx_) upx_=aix[i];
if(aiy[i]>upy_) upy_=aiy[i];
if(aix[i]>downx_) downx_=aix[i];
if(aiy[i]<downy_) downy_=aiy[i];
}
upx_=upx_+len,downx_=downx_-len,upy_=upy_-len,downy_=downy_+len;
for(int i=;i<=n;i++)
{
if(if_[i]==) continue;
if(aix[i]<=upx_&&aiy[i]>=upy_) if_[i]=;
}
if(thcheck(len)) return true;
for(int i=;i<=n;i++)
{
if(if_[i]==) continue;
if(aix[i]<=upx_&&aiy[i]<=downy_) if_[i]=;
else if_[i]=;
}
if(thcheck(len)) return true;
for(int i=;i<=n;i++)
{
if(if_[i]==) continue;
if(aix[i]>=downx_&&aiy[i]>=upy_) if_[i]=;
else if_[i]=;
}
if(thcheck(len)) return true;
for(int i=;i<=n;i++)
{
if(if_[i]==) continue;
if(aix[i]>=downx_&&aiy[i]<=downy_) if_[i]=;
else if_[i]=;
}
if(thcheck(len)) return true;
else return false;
} bool check(int len)
{
for(int i=;i<=n;i++) if_[i]=;
int upx_=upx+len,downx_=downx-len,upy_=upy-len,downy_=downy+len;
for(int i=;i<=n;i++) if(aix[i]<=upx_&&aiy[i]>=upy_) if_[i]=;
if(secheck(len)) return true;
for(int i=;i<=n;i++)
{
if(aix[i]<=upx_&&aiy[i]<=downy_) if_[i]=;
else if_[i]=;
}
if(secheck(len)) return true;
for(int i=;i<=n;i++)
{
if(aix[i]>=downx_&&aiy[i]>=upy_) if_[i]=;
else if_[i]=;
}
if(secheck(len)) return true;
for(int i=;i<=n;i++)
{
if(aix[i]>=downx_&&aiy[i]<=downy_) if_[i]=;
else if_[i]=;
}
if(secheck(len)) return true;
else return false;
} int main()
{
in(n);
upx=INF,upy=-INF;
downx=-INF,downy=INF;
for(int i=;i<=n;i++)
{
in(aix[i]),in(aiy[i]);
if(aix[i]<upx) upx=aix[i];
if(aiy[i]>upy) upy=aiy[i];
if(aix[i]>downx) downx=aix[i];
if(aiy[i]<downy) downy=aiy[i];
}
maxlen=max(upy-downy,downx-upx);
int l=,r=maxlen,ans=0x7fffffff;
while(l<=r)
{
int mid=l+r>>;
if(check(mid)) ans=mid,r=mid-;
else l=mid+;
}
cout<<ans;
return ;
}

AC日记——[HAOI2007]覆盖问题 bzoj 1052的更多相关文章

  1. 二分判定 覆盖问题 BZOJ 1052

    //二分判定 覆盖问题 BZOJ 1052 // 首先确定一个最小矩阵包围所有点,则最优正方形的一个角一定与矩形一个角重合. // 然后枚举每个角,再解决子问题 #include <bits/s ...

  2. 1052: [HAOI2007]覆盖问题 - BZOJ

    Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄膜将小 ...

  3. AC日记——地鼠游戏 codevs 1052

    1052 地鼠游戏  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 王钢是一名学习成绩优异的学生,在平 ...

  4. AC日记——[HEOI2012]旅行问题 bzoj 2746

    2746 思路: 建立ac自动机,然后把fail树抽出来: 然后在fail树上走lca(神奇): 代码: #include <cstdio> #include <vector> ...

  5. AC日记——[HAOI2007]理想的正方形 P2216

    [HAOI2007] 理想的正方形 思路: 正解多个单调队列: 但是我用树套树水了过去: 来,上代码: #include <cstdio> #include <cstring> ...

  6. AC日记——[HNOI2008]GT考试 bzoj 1009

    1009 思路: KMP上走DP(矩阵加速): DP[i][j]表示当前在第i位,同是匹配到不吉利串的第j位的方案数: 代码: #include <bits/stdc++.h> using ...

  7. AC日记——明明的烦恼 bzoj 1005

    1005 思路: prufer编码+组合数: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 #de ...

  8. AC日记——Mato的文件管理 bzoj 3289

    3289 思路: 莫队求区间逆序对个数,树状数组维护: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 500 ...

  9. AC日记——[Scoi2010]序列操作 bzoj 1858

    1858 思路: 恶心: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct Tree ...

随机推荐

  1. Python字符串的常用操作学习

    >>> name = "I love my job!" >>> name.capitalize() #首字母大写 'I love my job! ...

  2. 用js做的表单的增,删,以及全选

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>创 ...

  3. 孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4

    孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十一天. 今天继续学习mongoDB的简单操作 ...

  4. Opencv3.0.0安装包

    这个资源是Opencv3.0.0安装包,包括Windows软件包,Android软件包,IOS软件包,还有opencv的源代码:需要的下载吧. 点击下载

  5. JavaWeb笔记(四)Cookie&Session

    Cookie 客户端会话技术,客户端保存,用于存储少量不太敏感的数据,在不登陆的情况下完成服务器对客户端的身份识别 简单使用步骤 创建Cookie对象,绑定数据 new Cookie(String n ...

  6. 团队冲刺Alpha(九)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  7. idea中新建的web项目不能新建servlet

    ============ ======================================================================== 在新建的“ java ”源文 ...

  8. Python中的多线程编程,线程安全与锁(二)

    在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...

  9. LeetCode -- Sum Root to Leaf NNumbers

    Related Links: Path Sum: http://www.cnblogs.com/little-YTMM/p/4529982.html Path Sum II: http://www.c ...

  10. VS2013下配置OpenCV 3.0.0 &&& VS2013下配置Opencv2.4.9

    最近做图像需要用到Matlab和OpenCV,一些东西真的是要深入的研究进去才会有所发现,但Matlab和C++都不是我擅长的语言,所以要很加油很加油才行啊!! 步入正题. 1.  环境:Win7 6 ...