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. Field 'flag' doesn't have a default value错误

    错误代码: java.sql.SQLException: Field 'flag' doesn't have a default value at com.mysql.jdbc.SQLError.cr ...

  2. wget 下载页面下所有文件

    先介绍几个参数:-c 断点续传(备注:使用断点续传要求服务器支持断点续传),-r 递归下载(目录下的所有文件,包括子目录),-np 递归下载不搜索上层目录,-k 把绝对链接转为相对链接,这样下载之后的 ...

  3. 《Cracking the Coding Interview》——第1章:数组和字符串——题目5

    2014-03-18 01:40 题目:对字符串进行类似游程编码的压缩,如果压缩完了长度更长,则返回不压缩的结果.比如:aabcccccaaa->a2b1c5a3,abc->abc. 解法 ...

  4. 【Feasibility of Learning】林轩田机器学习基石

    这一节的核心内容在于如何由hoeffding不等式 关联到机器学习的可行性. 这个PAC很形象又准确,描述了“当前的可能性大概是正确的”,即某个概率的上届. hoeffding在机器学习上的关联就是: ...

  5. sources.ustc.debian

    deb http://mirrors.ustc.edu.cn/debian/ jessie main contrib non-free deb-src http://mirrors.ustc.edu. ...

  6. sshd_config_for_centos

    # $OpenBSD: sshd_config,v // :: djm Exp $ # This is the sshd server system-wide configuration file. ...

  7. rtmp jwplayer简单应用

    在nginx下使用,放到nginx/html文件夹内,之后访问 首先是播放vod视频 <!DOCTYPE html> <html xmlns="http://www.w3. ...

  8. hadoop-搭建(转)--亲测好用 (一)

    1)JDK软件 下载地址:http://www.oracle.com/technetwork/java/javase/index.html 2)Hadoop软件 下载地址:http://hadoop. ...

  9. 转换 nvarchar 值 '2013071200000578' 时溢出了整数列

    sqlserver 把一个nvarchar 与 int  类型 拼接 会自动转换 INT 做运算,nvarchar 类型有16位 转换失败 只能 str(int) 转换成 字符型 进行拼接 (sqls ...

  10. Android React Native组件的生命周期及回调函数

    熟悉android的童鞋应该都清楚,android是有生命周期的,其很多组件也是有生命周期.今天小编和大家分享的React Native组件的生命周期,还不了解的童鞋,赶紧来围观吧 在android开 ...