bzoj 1052 dfs
首先可以二分答案,将最优性问题转化为判定性问题。
对于二分到的边长,我们可以把所有的点看成一个大的矩形,这个矩形为包括所有点的最小矩形,那么贪心的想,3个正方形,第一个肯定放在这个矩形其中的一角,然后去掉覆盖的点,然后再求出一个矩形,然后再枚举放在哪一角,去掉之后判断剩下的是否可以由一个正方形覆盖就行了。
反思:没画图,边界算的不对,而且枚举完两个正方形之后要判下是否没有没覆盖的点了。另外提供神样例 4 1 1 -1 -1 1 -1 -1 1答案是2。
/**************************************************************
Problem: 1052
User: BLADEVIL
Language: C++
Result: Accepted
Time:1484 ms
Memory:1280 kb
****************************************************************/
//By BLADEVIL
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 20010
#define inf (~0U>>1)
using namespace std;
struct rec {
int x,y,flag;
rec(){
x=y=flag=;
}
}a[maxn],b[maxn];
int n;
bool cmp(rec x,rec y) {
return (x.flag<y.flag);
}
void update(rec &MAX,rec &MIN) {
MAX.x=MAX.y=-inf;
MIN.x=MIN.y=inf;
for (int i=;(i<=n)&&(!b[i].flag);i++) {
MAX.x=max(MAX.x,b[i].x);
MIN.x=min(MIN.x,b[i].x);
MAX.y=max(MAX.y,b[i].y);
MIN.y=min(MIN.y,b[i].y);
}
}
void make(int x,int len) {
rec MAX,MIN;
update(MAX,MIN);
//printf("%d %d %d %d\n",MAX.x,MAX.y,MIN.x,MIN.y);
int up,down,left,right;
if (x==) {
up=MAX.y; left=MIN.x;
down=up-len; right=left+len;
}
if (x==) {
up=MIN.y+len; left=MIN.x;
right=left+len; down=MIN.y;
}
if (x==) {
right=MAX.x; left=right-len;
down=MIN.y; up=down+len;
}
if (x==) {
up=MAX.y; down=up-len;
right=MAX.x; left=right-len;
}
//printf("%d %d %d %d %d\n",x,left,right,up,down);
for (int i=;i<=n;i++) if ((b[i].x<=right)&&(b[i].x>=left)&&(b[i].y<=up)&&(b[i].y>=down)) b[i].flag=;
}
bool work(int i,int j,int x) {
memcpy(b,a,sizeof a);
make(i,x);
sort(b+,b++n,cmp);
make(j,x);
sort(b+,b++n,cmp);
rec MAX,MIN;
update(MAX,MIN);
int left=MIN.x,right=MAX.x,up=MAX.y,down=MIN.y;
//printf("%d %d %d %d %d\n",x,left,right,up,down);
if ((left==inf)&&(right==-inf)&&(up==-inf)&&(down==inf)) return ;
if ((MAX.x-MIN.x<=x)&&(MAX.y-MIN.y<=x)) return ; else return ;
}
bool judge(int x) {
for (int i=;i<=;i++)
for (int j=;j<=;j++) if (i!=j) if (work(i,j,x)) return ;
return ;
}
int main() {
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
//printf("%d\n",work(1,2,1)); return 0;
int l=,r=1e9,ans=;
while (l<=r) {
//printf("%d %d\n",l,r);
int mid=l+r>>;
if (judge(mid)) ans=mid,r=mid-; else l=mid+;
}
printf("%d\n",ans);
return ;
}
bzoj 1052 dfs的更多相关文章
- BZOJ 1052: [HAOI2007]覆盖问题
BZOJ 1052: [HAOI2007]覆盖问题 题意:给定平面上横纵坐标在-1e9~1e9内的20000个整数点的坐标,用三个大小相同边平行于坐标轴的正方形覆盖(在边界上的也算),问正方形的边长最 ...
- 二分判定 覆盖问题 BZOJ 1052
//二分判定 覆盖问题 BZOJ 1052 // 首先确定一个最小矩阵包围所有点,则最优正方形的一个角一定与矩形一个角重合. // 然后枚举每个角,再解决子问题 #include <bits/s ...
- BZOJ 1052 HAOI2007 覆盖问题 二分法答案+DFS
标题效果:特定n点.涵盖所有的点与同方三面.斧头要求方垂直边界,最小平方的需求方长值 最大值至少.答案是很明显的二分法 但验证是一个问题 考虑仅仅有三个正方形,故用一个最小矩形覆盖这三个正方形时至少有 ...
- BZOJ 1052 覆盖问题
Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄膜将小 ...
- [BZOJ 1052][HAOI2007]覆盖问题(二分答案)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1052 分析: 挺有想法的一道题,先二分答案ans,主要是判断的问题. 首先可以弄出把所 ...
- bzoj 4034(DFS序+线段树)
这个题多了一个操作难度直线上升,看完题解才会写 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 ...
- bzoj 2819(DFS序+树状数组+博弈+lca)
2819: Nim Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2045 Solved: 795[Submit][Status][Discuss] ...
- bzoj 1225 dfs + 一点点数论
思路:有一个公式 如果 x = a1 ^ b1 * a2 ^ b2 * ...... * an ^ bn 其中ai为质数,那么总共的因子个数为 (b1 + 1) * (b2 + 1) *....* ...
- 【以前的空间】bzoj 1052 [HAOI2007]覆盖问题
这道题的思路挺简单的……就是可以证明如果要覆盖一个区域内的点,那么一定有一个正方形在这“区域内的点所围成的最大矩形的四个角中的一个”(不要吐槽很多的“的”……),对于长度r是否可以覆盖整个区域内的点, ...
随机推荐
- 理解BitSet
先来看几道面试题: 1.统计40亿个数据中没有出现的数据,将40亿个不同数据进行排序. 2.现在有1千万个随机数,随机数的范围在1到1亿之间,要求写出一种算法,将1到1亿之间没有在随机数中的数求出来. ...
- html5 拖拽练习题
html5新的拖拽 只支持Internet Explorer 9.Firefox.Opera 12.Chrome 以及 Safari 5 支持拖放. 来一个实例: <!DOCTYPE html& ...
- 禁止移动端input弹出软键盘
在做三级联动,或者一些时间插件的时候总是弹出软键盘,用下面的方法就可以禁用掉,废话不多说直接上代码. HTML代码 <div class=""> <div> ...
- 文件上传C:\fakepath\解决方案
1.设置IE:工具 -> Internet选项 -> 安全 -> 自定义级别 -> 找到“其他”中的“将本地文件上载至服务器时包含本地目录路径”,选中“启用”即可 2.利用js ...
- hdu3625-Rooms
题目 有\(n\)个房间,\(n\)个钥匙,每个钥匙随机出现在一个房间里,一个房间里有且仅有一个钥匙.我们现在手上没有钥匙,但我们要搜索所有的房间,所以我们有\(k\)次机会把一个房间炸开.一号房间里 ...
- 【bzoj1704】[Usaco2007 Mar]Face The Right Way 自动转身机 贪心
题目描述 农夫约翰有N(1≤N≤5000)只牛站成一排,有一些很乖的牛朝前站着.但是有些不乖的牛却朝后站着.农夫约翰需要让所有的牛都朝前站着.幸运的是约翰最近买了一个自动转身机.这个神奇的机器能使K( ...
- BZOJ1195 HNOI2006最短母串(状压dp)
按照子串出现的先后考虑.令f[i][j]为已经出现的字符串集合为i,最后一个出现的字符串为j时的最短串长,预处理一下任意两个串的最长重叠长度,转移显然.有点麻烦的是字典序,强行增加代码难度. 另一个比 ...
- [洛谷P3380]【模板】二逼平衡树(树套树)
题目大意:有$5$种操作: $1\;l\;r\;k:$查询$k$在区间$[l,r]$内的排名 $2\;l\;r\;k:$查询区间$[l,r]$内排名为$k$的值 $3\;pos\;k:$把第$pos$ ...
- CC DGCD:Dynamic GCD——题解
https://vjudge.net/problem/CodeChef-DGCD https://www.codechef.com/problems/DGCD 题目大意: 给一颗带点权的树,两个操作: ...
- YBT 1.2 二分与三分
二分与三分: 二分(单调性),三分(单峰性),这章主要考数学,模拟,与读题!!! 链接: https://pan.baidu.com/s/1AJTl_0p5Lh4T1MmNwyJWzg 密码: j3j ...