• [bzoj1052]覆盖问题


    先二分答案,容易发现一定有一个正方形覆盖在角上(即有两条边在最X的地方),否则4个最X的点一定无法覆盖,然后暴力确定即可

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 struct ji{
     4     int x,y;
     5     bool operator < (const ji &k)const{
     6         return x<k.x;
     7     }
     8 }a[20005];
     9 int n,vis[20005];
    10 void bj(int lx,int rx,int ly,int ry,int p){
    11     for(int i=1;i<=n;i++)
    12         if ((lx<=a[i].x)&&(a[i].x<=rx)&&(ly<=a[i].y)&&(a[i].y<=ry)&&(!vis[i]))vis[i]=p;
    13 }
    14 void clear(int k){
    15     for(int i=1;i<=n;i++)
    16         if (vis[i]==k)vis[i]=0;
    17 }
    18 bool pd(int l,int k){
    19     if (!k){
    20         for(int i=1;i<=n;i++)
    21             if (!vis[i])return 0;
    22         return 1;
    23     }
    24     int lx=1e9,rx=-1e9,ly=1e9,ry=-1e9,p=0;
    25     for(int i=1;i<=n;i++)
    26         if (!vis[i]){
    27             lx=min(lx,a[i].x);
    28             ly=min(ly,a[i].y);
    29             rx=max(rx,a[i].x);
    30             ry=max(ry,a[i].y);
    31         }
    32     bj(lx,lx+l,ly,ly+l,k);
    33     p|=pd(l,k-1);
    34     clear(k);
    35     bj(lx,lx+l,ry-l,ry,k);
    36     p|=pd(l,k-1);
    37     clear(k);
    38     bj(rx-l,rx,ly,ly+l,k);
    39     p|=pd(l,k-1);
    40     clear(k);
    41     bj(rx-l,rx,ry-l,ry,k);
    42     p|=pd(l,k-1);
    43     clear(k);
    44     return p;
    45 }
    46 int main(){
    47     scanf("%d",&n);
    48     for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);
    49     sort(a+1,a+n+1);
    50     int l=0,r=1e9;
    51     while (l<r){
    52         int mid=(l+r>>1);
    53         if (pd(mid,3))r=mid;
    54         else l=mid+1;
    55     }
    56     printf("%d",l);
    57 }
    View Code
  • 相关阅读:
    Hadoop 的版本问题
    SSH 端口转发原理
    KM算法
    最大流算法小结
    pku 2195 KM算法求最小权二分匹配
    SAP(最短增广路算法) 最大流模板
    最大流模板
    pku 1459 最大流 SAP
    pku Drainage Ditches 简单最大流 直接套模板 注意可能有重边
    推荐:吴军 谷歌黑板报 《浪潮之颠》
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/11775557.html
Copyright © 2020-2023  润新知