$AcWing$

$Sol$

平面最近点对板子题,注意要求的是两种不同的点之间的距离.

$Code$

  1. #include<bits/stdc++.h>
  2. #define il inline
  3. #define Rg register
  4. #define go(i,a,b) for(Rg int i=a;i<=b;++i)
  5. #define yes(i,a,b) for(Rg int i=a;i>=b;--i)
  6. #define mem(a,b) memset(a,b,sizeof(a))
  7. #define ll long long
  8. #define db double
  9. #define inf 2100000000
  10. using namespace std;
  11. il int read()
  12. {
  13. Rg int x=,y=;char c=getchar();
  14. while(c<''||c>''){if(c=='-')y=-;c=getchar();}
  15. while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
  16. return x*y;
  17. }
  18. int T,n;
  19. struct node{int x,y;bool tp;}a[(int)1e5*+],tmp[(int)1e5*+];
  20. il bool cmp(node x,node y){if(x.x==y.x)return x.y<y.y;return x.x<y.x;}
  21. il bool cmp1(node x,node y){return x.y<y.y;}
  22. il ll dis(node x,node y){db xx=x.x-y.x,yy=x.y-y.y;return xx*xx+yy*yy;}
  23. il ll sol(int l,int r)
  24. {
  25. if(l>r || l==r)return inf;
  26. if(l+==r)
  27. {
  28. if(a[l].tp!=a[r].tp){return dis(a[l],a[r]);}
  29. else return inf;
  30. }
  31. Rg int mid=(l+r)>>,ct=;
  32. ll mins=min(sol(l,mid),sol(mid+,r));
  33. go(i,l,r){if((a[i].x-a[mid].x)*(a[i].x-a[mid].x)<=mins)tmp[++ct]=a[i];}
  34. sort(tmp+,tmp+ct+,cmp1);
  35. go(i,,ct)
  36. go(j,i+,ct)
  37. {
  38. if((tmp[j].y-tmp[i].y)*(tmp[j].y-tmp[i].y)>mins)break;
  39. if(tmp[i].tp!=tmp[j].tp)mins=min(mins,dis(tmp[i],tmp[j]));
  40. }
  41. return mins;
  42. }
  43. int main()
  44. {
  45. T=read();
  46. while(T--)
  47. {
  48. n=read();
  49. go(i,,n)a[i]=(node){read(),read(),};
  50. go(i,,n)a[i+n]=(node){read(),read(),};
  51. sort(a+,a+n*+,cmp);
  52. printf("%.3lf\n",sqrt(sol(,*n)));
  53. }
  54. return ;
  55. }

随机推荐

  1. Data Flow-File Read-基本过程

  2. oracle函数 NLS_UPPER(x[,y])

    [功能]返回字符串并将字符串的转换为大写; [参数]x字符型表达式 [参数]Nls_param可选,指定排序的方式(nls_sort=) . SCHINESE_RADICAL_M(部首.笔画) SCH ...

  3. Linux中使用gcc编译文件

    一个项目中可能有多个cpp文件,在linux下编译执行过程如下: g++ main.cpp distance.cpp ./a.out 即可一起编译两个文件,然后执行该程序.

  4. Android 高仿新浪微博底部导航栏,实现双击首页Tab,页面的ListView滚动、刷新

    现在很多APP,如微信.QQ.微博等等,它们的主页面都无一例外的选择使用底部Tab导航, 通过这种方式,可以很好的把页面层级分化,很好的提高用户体验.相信,很多Android开发者,都使用到过这种经典 ...

  5. AtCoder Beginner Contest 078 D ABS

    光做C了,做完C,就要结束了,看了看D,没看懂那操作啥意思,就扔了. 刚才看了看,突然懂了.. 就是每个人从那堆牌上边拿牌,最少拿一张,最多可以全拿走,然后手里留下最后一张拿到的,其余的都扔掉. 比如 ...

  6. EC round 33 D. Credit Card 贪心

    因为到为0的点,充钱的范围都是不确定的,我们维护一个满足条件的最小值以及满足条件的最大值. 当min>d时,代表已经满足条件限制了 当a[ i ] = 0 并且 max<0,代表需要充钱, ...

  7. Ubuntu 18.04LTS安装配置Java OpenJDK8

    安装OpenJDK8 sudo apt-get install openjdk-8-jdk 配置Java环境变量 sudo vim /etc/profile 在profile末尾添加以下内容: exp ...

  8. 2019-6-23-修复-dotnet-Core-缺SDK编译失败

    title author date CreateTime categories 修复 dotnet Core 缺SDK编译失败 lindexi 2019-6-23 10:55:9 +0800 2019 ...

  9. 【CSS3】loading动画

    HTML: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  10. SQL 三个表练习(student,teacher,score)