[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
原文地址:https://www.cnblogs.com/PYWBKTDA/p/11775557.html