首先可以二分答案,将最优性问题转化为判定性问题。

  对于二分到的边长,我们可以把所有的点看成一个大的矩形,这个矩形为包括所有点的最小矩形,那么贪心的想,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的更多相关文章

  1. BZOJ 1052: [HAOI2007]覆盖问题

    BZOJ 1052: [HAOI2007]覆盖问题 题意:给定平面上横纵坐标在-1e9~1e9内的20000个整数点的坐标,用三个大小相同边平行于坐标轴的正方形覆盖(在边界上的也算),问正方形的边长最 ...

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

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

  3. BZOJ 1052 HAOI2007 覆盖问题 二分法答案+DFS

    标题效果:特定n点.涵盖所有的点与同方三面.斧头要求方垂直边界,最小平方的需求方长值 最大值至少.答案是很明显的二分法 但验证是一个问题 考虑仅仅有三个正方形,故用一个最小矩形覆盖这三个正方形时至少有 ...

  4. BZOJ 1052 覆盖问题

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

  5. [BZOJ 1052][HAOI2007]覆盖问题(二分答案)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1052 分析: 挺有想法的一道题,先二分答案ans,主要是判断的问题. 首先可以弄出把所 ...

  6. bzoj 4034(DFS序+线段树)

    这个题多了一个操作难度直线上升,看完题解才会写 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 ...

  7. bzoj 2819(DFS序+树状数组+博弈+lca)

    2819: Nim Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2045  Solved: 795[Submit][Status][Discuss] ...

  8. bzoj 1225 dfs + 一点点数论

    思路:有一个公式  如果 x = a1 ^ b1 * a2 ^ b2 * ...... * an ^ bn 其中ai为质数,那么总共的因子个数为 (b1 + 1) * (b2 + 1) *....* ...

  9. 【以前的空间】bzoj 1052 [HAOI2007]覆盖问题

    这道题的思路挺简单的……就是可以证明如果要覆盖一个区域内的点,那么一定有一个正方形在这“区域内的点所围成的最大矩形的四个角中的一个”(不要吐槽很多的“的”……),对于长度r是否可以覆盖整个区域内的点, ...

随机推荐

  1. Python ZKPython 安装

    1.由于python客户端依赖c的客户端所以要先安装c版本的客户端cd zookeeper-3.4.5/src/c./configuremake make install 2.下载python扩展包, ...

  2. concurrenthashmap jdk1.8

    参考:https://www.jianshu.com/p/c0642afe03e0 CAS的思想很简单:三个参数,一个当前内存值V.旧的预期值A.即将更新的值B,当且仅当预期值A和内存值V相同时,将内 ...

  3. MYsql 数据库密码忘记(Window)-2(mysql 5.7)

    很久没用Mysql了,再次打开,发现用不了了,密码忘了,服务也无法打开,在cmd中输入mysql之后,显示不是内部指令. 看来问题是mysql服务打不开了 (1)在cmd中 输入net start m ...

  4. [OS] 多线程--原子操作 Interlocked系列函数

    转自:http://blog.csdn.net/morewindows/article/details/7429155 上一篇<多线程--第一次亲密接触 CreateThread与_begint ...

  5. 【bzoj4417】[Shoi2013]超级跳马 矩阵乘法

    题目描述 现有一个n行m列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘.例如,当n = 3, m = 10时,下图是一种可行的跳法.   ...

  6. BZOJ3167/BZOJ4824 HEOI2013SAO/CQOI2017老C的键盘(树形dp)

    前者是后者各方面的强化版. 容易想到设f[i][j]表示i子树中第j小的是i的方案数(即只考虑相对关系).比较麻烦的在于转移.考虑逐个合并子树.容易想到枚举根原来的排名和子树根原来的排名,算一发组合数 ...

  7. BZOJ3997 TJOI2015组合数学(动态规划)

    copy: Dilworth定理:DAG的最小链覆盖=最大点独立集 最小链覆盖指选出最少的链(可以重复)使得每个点都在至少一条链中 最大点独立集指最大的集合使集合中任意两点不可达 此题中独立的定义即是 ...

  8. [洛谷P2057][SHOI2007]善意的投票

    题目大意:有$n(n\leqslant300)$个人,每个人可以选择$0$或$1$,每个人最开始有意愿,有$m(m\leqslant\dfrac{n(n-1)}2)$对好朋友.定义一次的冲突数为好朋友 ...

  9. 【以前的空间】Poj 3071 Cut the Sequence

    dp+单调性+平衡树 在看某篇论文中看到这道题,但是那篇论文不如这个http://www.cnblogs.com/staginner/archive/2012/04/02/2429850.html 大 ...

  10. LOJ2537:[PKUWC2018]Minimax——题解

    https://loj.ac/problem/2537 参考了本题在网上能找到的为数不多的题解. 以及我眼睛瞎没看到需要离散化,还有不开longlong见祖宗. ——————————————————— ...