【bzoj1052】[HAOI2007]覆盖问题
2015-11-14 23:51
495 查看
一道简单的二分+贪心,先找四个最大最小坐标,以四个角中的一个为左上角划正方形,再找再划,最后判断剩下的点是否在一个正方形内。
AC Code:
AC Code:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define Ll long long using namespace std; const Ll a[2][4]={{0,0,-1,-1},{0,-1,0,-1}}; const Ll INF=21474836470LL; Ll sx[4],sy[4],ssx[4],ssy[4],x[20010],y[20010],up,dn,le,ri,n,maxlen,minlen; bool boo[20010]; void cover(Ll xx,Ll yy,Ll len){ Ll U=xx,L=yy,D=xx+len-1,R=yy+len-1; for (int i=1;i<=n;i++) if (x[i]>=U&&x[i]<=D&&y[i]>=L&&y[i]<=R) boo[i]=1; return; } bool in_square(Ll len){ Ll U=INF,D=-INF,R=-INF,L=INF; for (int i=1;i<=n;i++)if (!boo[i]){ U=min(x[i],U);D=max(x[i],D); R=max(y[i],R);L=min(y[i],L); } if ((D-U+1>len)||(R-L+1>len)) return 0; return 1; } void getss(){ Ll U=INF,D=-INF,R=-INF,L=INF; for (int i=1;i<=n;i++)if (!boo[i]){ U=min(x[i],U);D=max(x[i],D); R=max(y[i],R);L=min(y[i],L); } ssx[0]=U;ssx[1]=U;ssx[2]=D;ssx[3]=D; ssy[0]=L;ssy[1]=R;ssy[2]=L;ssy[3]=R; return ; } bool ok(Ll len){ if ((len>=minlen)&&(len*3>=maxlen)) return 1; for (int i=0;i<4;i++){ Ll x1=sx[i]+a[0][i]*(len-1); Ll y1=sy[i]+a[1][i]*(len-1); memset(boo,0,sizeof(boo)); cover(x1,y1,len); if (in_square(len)) return 1; getss(); for (int j=0;j<4;j++) { memset(boo,0,sizeof(boo)); cover(x1,y1,len); Ll x2=ssx[j]+a[0][j]*(len-1); Ll y2=ssy[j]+a[1][j]*(len-1); cover(x2,y2,len); if (in_square(len)) return 1; } } return 0; } int main(){ scanf("%d",&n); up=INF;dn=-INF; ri=-INF;le=INF; for (int i=1;i<=n;i++){ scanf("%lld%lld",&x[i],&y[i]); up=min(x[i],up);dn=max(x[i],dn); ri=max(y[i],ri);le=min(y[i],le); } sx[0]=up;sx[1]=up;sx[2]=dn;sx[3]=dn; sy[0]=le;sy[1]=ri;sy[2]=le;sy[3]=ri; maxlen=max(dn-up+1,ri-le+1); minlen=min(dn-up+1,ri-le+1); Ll l=1LL,r=maxlen; while (l!=r){ int mid=(l+r)>>1; if (ok(mid)) r=mid; else l=mid+1; } printf("%lld\n",l-1); }
相关文章推荐
- how browser works
- IP组播技术介绍及实现例子
- 黑马程序员——File类及Properties类
- [kuangbin带你飞]专题一 简单搜索 总结
- 第一个Sprint冲刺第四天
- 个人阅读作业Week7
- (转载)深入PendingIntent
- Android 多线程断点下载project总结
- Java再学习——synchronized与volatile
- Step by Step Learn Python(1)
- 用gdb来调试除数为0而产生的core
- Python正则表达式指南
- 索引列的选择
- [阅读]个人阅读作业week7
- javax.net.ssl.SSLException: hostname in certificate didn't match:
- week7 read
- SQL分页查询
- Mac OS下应用Python+Selenium实现web自动化测试
- oc foundation库
- git/github学习笔记