[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 }