标签:bzoj1052 haoi2007 覆盖问题 二分答案 深搜
题解:乱搞。
就是搜每个正方形的位置(一定在一个角,证明自己想想吧,很容易但是不算太好写)
代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 20100 #define inf 0x3f3f3f3f using namespace std; struct Point { int x,y; Point(int _x=0,int _y=0):x(_x),y(_y){} bool ins(int xl,int xr,int yl,int yr) { if(x<xl||xr<x)return 0; if(y<yl||yr<y)return 0; return 1; } }P[N]; int vis[N]; int n; bool check(int mid,int dep,int xl,int xr,int yl,int yr) // 当前矩形 { if(xl>xr)return 1; if(dep>3)return 0; int i,j,k; int ra[4],rb[4],rc[4],rd[4]; // 这个东西我竟然傻叉到开了全局…… sad story ra[0]=ra[1]=xl,rb[0]=rb[1]=xl+mid; ra[2]=ra[3]=xr-mid,rb[2]=rb[3]=xr; rc[0]=rc[2]=yl,rd[0]=rd[2]=yl+mid; rc[1]=rc[3]=yr-mid,rd[1]=rd[3]=yr; for(j=0;j<4;j++) { int sxl=ra[j],sxr=rb[j],syl=rc[j],syr=rd[j]; // 当前正方形 int nxl=inf,nxr=-inf,nyl=inf,nyr=-inf; // 新矩形 for(i=1;i<=n;i++)if(!vis[i]) { if(P[i].ins(sxl,sxr,syl,syr))vis[i]=dep; else { nxl=min(nxl,P[i].x),nxr=max(nxr,P[i].x); nyl=min(nyl,P[i].y),nyr=max(nyr,P[i].y); } } if(check(mid,dep+1,nxl,nxr,nyl,nyr))return 1; for(i=1;i<=n;i++)if(vis[i]==dep)vis[i]=0; } return 0; } int main() { // freopen("test.in","r",stdin); int i,j,k; int x,y; scanf("%d",&n); int xl=inf,xr=-inf,yl=inf,yr=-inf; for(i=1;i<=n;i++) { scanf("%d%d",&x,&y); xl=min(xl,x),xr=max(xr,x); yl=min(yl,y),yr=max(yr,y); P[i]=Point(x,y); } int l=0,r=max(xr-xl,yr-yl),mid,ans; while(l<r) { if(r-l<3) { ans=inf; for(i=r;i>=l;i--) { memset(vis,0,sizeof(vis)); if(check(i,1,xl,xr,yl,yr))ans=i; } break; } int mid=l+r>>1; memset(vis,0,sizeof(vis)); if(check(mid,1,xl,xr,yl,yr))r=mid; else l=mid; } printf("%d\n",ans); return 0; }
【BZOJ1052】【HAOI2007】覆盖问题 二分+深搜check
标签:bzoj1052 haoi2007 覆盖问题 二分答案 深搜
原文地址:http://blog.csdn.net/vmurder/article/details/42607653