poj 3714 Raid 分治
2013-10-07 16:18
274 查看
先按横坐标排序,然后分治,合并的时候只需要处理两边x坐标差在d范围内的点即可。把这些点找出来之后,再按照y值排序,然后再检查y坐标差在d以内的点,那么可以保证每个点最多检查6个点(否则这些点之间必定存在距离小于d的点对),那么可以保证o(n)的合并。总的复杂度nlognlogn。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int maxn=1e5+9; const double inf=1e11; struct D { int x,y,id; bool operator <(const D & xx) const { return x<xx.x; } }data[maxn<<1],now[maxn<<1]; struct cmp { bool operator()(D a,D b) { return a.y<b.y; } }; double cal(int t,int s) { if(now[t].id==now[s].id) return inf; double a=now[t].x-now[s].x; double b=now[t].y-now[s].y; a*=a; b*=b; return sqrt(a+b); } double solve(int l,int r) { if(l==r) return inf; int mid=l+r>>1; double ret=solve(l,mid); ret=min(ret,solve(mid+1,r)); int lon=0; for(int i=mid;i>=l;i--) { if(data[mid+1].x-data[i].x>ret) break; now[++lon]=data[i]; } for(int j=mid+1;j<=r;j++) { if(data[j].x-data[mid].x>ret) break; now[++lon]=data[j]; } sort(now+1,now+1+lon); for(int i=1;i<=lon;i++) for(int j=i+1;j<=lon;j++) { if(now[j].y-now[i].y>ret) break; ret=min(ret,cal(i,j)); } return ret; } int main() { int T,n; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n+n;i++) { scanf("%d %d",&data[i].x,&data[i].y); data[i].id=i>n; } sort(data+1,data+1+n+n); double ans=solve(1,n+n); printf("%.3f\n",ans); } return 0; }
相关文章推荐
- main函数之前--真正的函数执行入口或开始
- 【Rails学习笔记】在控制台、服务器和迁移命令中指定其他环境的方法
- 使用 DBMS_REPAIR 修复坏块
- hdu 2476 String painter 动态规划
- WPF编译时提示“...不包含适合于入口点的静态‘Main’方法 ...”
- Train Problem I
- QPaintDevice: Cannot destroy paint device that is being painted
- Centos下apache启动时httpd: apr_sockaddr_info_get() failed for 报错
- QWidget::paintEngine: Should no longer be called
- open failed: EACCES (Permission denied)
- Adobe AIR对本地文件(XML文件)的操作
- [每日一题] 11gOCP 1z0-053 :2013-10-6 significance of the CHANGE FAILURE ..................25
- [每日一题] 11gOCP 1z0-053 :2013-10-6 significance of the CHANGE FAILURE ..................25
- 28、29、30th Training
- 【五子棋AI】AI的基本结构——剪裁函数
- 【五子棋AI】AI的基本结构——局面评价
- 下面程序为什么没有一直陷入main的while(1)循环?(多线程在作怪)
- 解决maillog文件删除后,空间不释放
- 【五子棋AI】AI的基本结构——招法生成器
- 【五子棋AI】AI的基本结构——局面表示