K远点对 bzoj-4520 Cqoi-2016

题目大意:已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对。

注释:$1\le n\le 10^5$,$1\le k\le 100$,$k\le n*(n-1)/2$,$0\le x,y<2^{31}$。


想法

KD-Tree还是很暴力的。

我们只需要考虑直接暴力的维护一个个数为$k$的堆即可。

复杂度什么的都滚蛋吧,反正能过。

Code

  1. #include <bits/stdc++.h>
  2. #define inf 10000000000000000ll
  3. #define N 100010
  4. using namespace std; typedef long long ll;
  5. char *p1,*p2,buf[100000]; int d,root;
  6. #define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
  7. int rd() {int x=0; char c=nc(); while(c<48) c=nc(); while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x;}
  8. priority_queue<ll,vector<ll>,greater<ll> >q;
  9. struct Node {int p[2],ls,rs,mn[2],mx[2];}a[N];
  10. inline bool cmp(const Node &a,const Node &b) {return a.p[d]==b.p[d]?a.p[d^1]<b.p[d^1]:a.p[d]<b.p[d];}
  11. template <typename T> void Max(T &x,T y) {x=max(x,y);}
  12. template <typename T> void Min(T &x,T y) {x=min(x,y);}
  13. inline void pushup(int x,int k)
  14. {
  15. Max(a[x].mx[0],a[k].mx[0]); Max(a[x].mx[1],a[k].mx[1]);
  16. Min(a[x].mn[0],a[k].mn[0]); Min(a[x].mn[1],a[k].mn[1]);
  17. }
  18. int build(int l,int r,int now)
  19. {
  20. int mid=(l+r)>>1;
  21. d=now; nth_element(a+l,a+mid,a+r+1,cmp);
  22. a[mid].mn[0]=a[mid].mx[0]=a[mid].p[0];
  23. a[mid].mn[1]=a[mid].mx[1]=a[mid].p[1];
  24. if(l<mid) a[mid].ls=build(l,mid-1,now^1),pushup(mid,a[mid].ls);
  25. if(mid<r) a[mid].rs=build(mid+1,r,now^1),pushup(mid,a[mid].rs);
  26. return mid;
  27. }
  28. inline ll sqr(ll x) {return x*x;}
  29. inline ll getdis(int x,int p0,int p1) {return sqr(max(abs(p0-a[x].mx[0]),abs(p0-a[x].mn[0])))+sqr(max(abs(p1-a[x].mn[1]),abs(p1-a[x].mx[1])));}
  30. void query(int x,int k)
  31. {
  32. int ls=a[x].ls,rs=a[x].rs; ll dl,dr;
  33. dl=ls?getdis(ls,a[k].p[0],a[k].p[1]):-inf;
  34. dr=rs?getdis(rs,a[k].p[0],a[k].p[1]):-inf;
  35. ll dis=sqr(a[k].p[0]-a[x].p[0])+sqr(a[k].p[1]-a[x].p[1]);
  36. if(dis>q.top()&&x!=k) q.pop(),q.push(dis);
  37. if(dl>dr)
  38. {
  39. if(dl>q.top()) query(ls,k);
  40. if(dr>q.top()) query(rs,k);
  41. }
  42. else
  43. {
  44. if(dr>q.top()) query(rs,k);
  45. if(dl>q.top()) query(ls,k);
  46. }
  47. }
  48. int main()
  49. {
  50. int n=rd(),m=rd(); m*=2;
  51. for(int i=1;i<=n;i++) a[i].p[0]=rd(),a[i].p[1]=rd();
  52. root=build(1,n,0);
  53. for(int i=1;i<=m;i++) q.push(0);
  54. for(int i=1;i<=n;i++) query(root,i);
  55. cout << q.top() << endl ;
  56. return 0;
  57. }

小结:好题。

[bzoj4520][Cqoi2016]K远点对_KD-Tree_堆的更多相关文章

  1. [BZOJ4520][Cqoi2016]K远点对 kd-tree 优先队列

    4520: [Cqoi2016]K远点对 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1285  Solved: 708[Submit][Statu ...

  2. BZOJ4520 [Cqoi2016]K远点对

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  3. BZOJ4520:[CQOI2016]K远点对(K-D Tree)

    Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 N 行,每行两个整数 X,Y,表示一个点 的坐标 ...

  4. 【BZOJ4520】[Cqoi2016]K远点对 kd-tree+堆

    [BZOJ4520][Cqoi2016]K远点对 Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 ...

  5. 【BZOJ-4520】K远点对 KD-Tree + 堆

    4520: [Cqoi2016]K远点对 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 490  Solved: 237[Submit][Status ...

  6. BZOJ 4520: [Cqoi2016]K远点对

    4520: [Cqoi2016]K远点对 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 638  Solved: 340[Submit][Status ...

  7. 【BZOJ4520】K远点对(KD-Tree)

    [BZOJ4520]K远点对(KD-Tree) 题面 BZOJ 洛谷 题解 考虑暴力. 维护一个大小为\(K\)的小根堆,然后每次把两个点之间的距离插进去,然后弹出堆顶 这样子可以用\(KD-Tree ...

  8. [Cqoi2016]K远点对 K-Dtree

    4520: [Cqoi2016]K远点对 链接 bzoj 思路 用K-Dtree求点的最远距离. 求的时候顺便维护一个大小为2k的小根堆. 不知道为啥一定会对. 代码 #include <bit ...

  9. 【bzoj4520】 Cqoi2016—K远点对

    http://www.lydsy.com/JudgeOnline/problem.php?id=4520 (题目链接) 题意 求平面内第K远点对的距离. Solution 左转题解:jump 细节 刚 ...

随机推荐

  1. uoj #15. 【NOIP2014】生活大爆炸版石头剪刀布

    石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一 样,则不分胜负.在<生活大爆炸>第二季第 8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的石头剪 ...

  2. Locations for Public Frameworks

    Locations for Public Frameworks Third-party frameworks can go in a number of different file-system l ...

  3. CV方向:纽劢科技,复星,蚂蚁金服,哈喽出行,海康威视

    以下均为CV方向实习面试,岗位算法工程师助理.时间均在2019年3月至4月之间. 纽劢科技(均电话):        技术2面,HR1面 复星(现场):                  技术只有1面 ...

  4. zend studio汉化离线语言包安装方法

  5. 详解 pcap_findalldevs_ex

    pcap是packet capture的缩写.意为抓包. 功能:查找所有网络设备 原型:int pcap_findalldevs_ex(char* source,  struct pcap_rmtau ...

  6. java_tcp_简单示例

    package netProgram; import java.io.DataOutputStream; import java.io.IOException; import java.net.Ser ...

  7. 如何修改MFC的图标

    原文:如何修改MFC的图标 修改左上角的图标和任务栏里图标 在对话框构造函数中 CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/) : CDialog(CTestD ...

  8. Duplicate fragment name ERROR Jetty Maven Plugin

    http://stackoverflow.com/questions/5802096/duplicate-fragment-name-error-jetty-maven-plugin 4down vo ...

  9. opencv笔记

    加载图像: OpenCV支持图像格式Windows位图(bmp),便携式图像格式(pbm,pgm,ppm)和Sun光栅(sr,ras). Mat image = imread( imageName, ...

  10. MySQL操作数据库和表的基本语句(DDL)

    1.创建数据库: CREATE DATABASE 数据库名; eg.CREATE DATABASE test_ddl;2.创建表 CREATE TABLE 表名(列名 数据类型 约束,...); eg ...