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

维护大小为2k最小堆,KD树的估值用前面提到的做法

PS.网上有人估价是使用边界四个点的最值来独立枚举,然而这样写似乎过不了

  1. #include<bits/stdc++.h>
  2. #define rep(i,j,k) for(register int i=j;i<=k;i++)
  3. #define rrep(i,j,k) for(register int i=j;i>=k;i--)
  4. #define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
  5. #define print(a) printf("%lld",(ll)(a))
  6. #define println(a) printf("%lld\n",(ll)(a))
  7. #define printbk(a) printf("%lld ",(ll)(a))
  8. using namespace std;
  9. const int MAXN = 2e5+11;
  10. const int INF = 0x7fffffff;
  11. typedef long long ll;
  12. ll read(){
  13. ll x=0,f=1;register char ch=getchar();
  14. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  15. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  16. return x*f;
  17. }
  18. int D;
  19. struct point{
  20. int x[2];
  21. bool operator < (const point &rhs) const{
  22. return x[D]<rhs.x[D];
  23. }
  24. };
  25. struct KD{
  26. int son[MAXN][2];
  27. point p[MAXN],mn[MAXN],mx[MAXN];
  28. int root,ans,tot,n;
  29. priority_queue<ll,vector<ll>,greater<ll> > pq;
  30. void init(int t){
  31. ans=INF; tot=D=0; n=t;
  32. }
  33. void pu(int o){
  34. rep(i,0,1){
  35. if(son[o][i]) rep(j,0,1){
  36. if(mn[son[o][i]].x[j]<mn[o].x[j]) mn[o].x[j]=mn[son[o][i]].x[j];
  37. if(mx[son[o][i]].x[j]>mx[o].x[j]) mx[o].x[j]=mx[son[o][i]].x[j];
  38. }
  39. }
  40. }
  41. int build(int now,int l,int r){
  42. int mid=l+r>>1;
  43. tot++; son[mid][0]=son[mid][1]=0;
  44. D=now;nth_element(p+l,p+mid,p+r+1);//[l,r+1)
  45. mn[mid].x[0]=mx[mid].x[0]=p[mid].x[0];
  46. mn[mid].x[1]=mx[mid].x[1]=p[mid].x[1];
  47. if(l<mid) son[mid][0]=build(now^1,l,mid-1);
  48. if(r>mid) son[mid][1]=build(now^1,mid+1,r);
  49. pu(mid);
  50. return mid;
  51. }
  52. void insert(int &o,int now,point v){
  53. if(!o){
  54. o=++tot;
  55. p[o].x[0]=mn[o].x[0]=mx[o].x[0]=v.x[0];
  56. p[o].x[1]=mn[o].x[1]=mx[o].x[1]=v.x[1];
  57. }else{
  58. insert(son[o][p[o].x[now]<v.x[now]],now^1,v);
  59. pu(o);
  60. }
  61. }
  62. inline ll dis(point a,point b){
  63. return (ll)(a.x[0]-b.x[0])*(a.x[0]-b.x[0])+1ll*(a.x[1]-b.x[1])*(a.x[1]-b.x[1]);
  64. }
  65. inline point mp(int x,int y){
  66. point t;t.x[0]=x;t.x[1]=y;return t;
  67. }
  68. inline ll eva(int o,point &v){
  69. if(!o) return -6666;
  70. ll t1=max(abs(mn[o].x[0]-v.x[0]),abs(mx[o].x[0]-v.x[0]));
  71. ll t2=max(abs(mn[o].x[1]-v.x[1]),abs(mx[o].x[1]-v.x[1]));
  72. return t1*t1+t2*t2;
  73. }
  74. void query(int o,point &v){
  75. if(!o)return;
  76. while(pq.size()>2*n) pq.pop();
  77. ll d1=dis(p[o],v),d2=-6666,d3=-6666;
  78. if(pq.top()<d1){
  79. pq.pop();
  80. pq.push(d1);
  81. }
  82. if(son[o][0]) d2=eva(son[o][0],v);
  83. if(son[o][1]) d3=eva(son[o][1],v);
  84. if(d2>d3){
  85. if(d2>pq.top()) query(son[o][0],v);
  86. if(d3>pq.top()) query(son[o][1],v);
  87. }else{
  88. if(d3>pq.top()) query(son[o][1],v);
  89. if(d2>pq.top()) query(son[o][0],v);
  90. }
  91. }
  92. }kd;
  93. int main(){
  94. int n,k;
  95. while(cin>>n>>k){
  96. kd.init(k);
  97. rep(i,1,n){
  98. kd.p[i].x[0]=read();
  99. kd.p[i].x[1]=read();
  100. }
  101. kd.root=kd.build(0,1,n);
  102. while(!kd.pq.empty()) kd.pq.pop();
  103. rep(i,1,2*k) kd.pq.push(-666);
  104. rep(i,1,n){
  105. kd.query(kd.root,kd.p[i]);
  106. }
  107. println(kd.pq.top());
  108. }
  109. return 0;
  110. }

BZOJ - 4520 K远点对的更多相关文章

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

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

  2. BZOJ 4520 [Cqoi2016]K远点对(KD树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4520 [题目大意] 求K远点对距离 [题解] 修改估价函数为欧式上界估价,对每个点进行 ...

  3. BZOJ 4520: [Cqoi2016]K远点对(k-d tree)

    Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1162  Solved: 618[Submit][Status][Discuss] Descripti ...

  4. BZOJ 4520: [Cqoi2016]K远点对 KDtree + 估价函数 + 堆

    Code: #include<bits/stdc++.h> #define ll long long #define maxn 200000 #define inf 10000000000 ...

  5. 【52.55%】【BZOJ 4520】K远点对

    Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 588  Solved: 309 [Submit][Status][Discuss] Descript ...

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

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

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

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

  8. 【bzoj4520】 Cqoi2016—K远点对

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

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

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

随机推荐

  1. SpringBoot15 sell02 订单模块

    1 订单模块 1.1 MySQL数据表 订单模块涉及到两个数据表: 订单表:主要存储订单相关的基本信息 DROP TABLE IF EXISTS `order_master`; CREATE TABL ...

  2. 58. Length of Last Word最后一个单词的长度

    [抄题]: [暴力解法]: 时间分析: 空间分析: [优化后]: 时间分析: 空间分析: [奇葩输出条件]: [奇葩corner case]: "b a " 最后一位是空格,可能误 ...

  3. ubuntu14.04 安装PCL

    博客转自:https://blog.csdn.net/dwj6336736/article/details/76674018 系统安装 sudo add-apt-repository ppa:v-la ...

  4. ThinkPHP5权限控制

    我在用ThinkPHP5做开发的时候发现,它没有权限类,自己写太麻烦,于是就想到了把TP3里面的权限类拿来修改使用,结果这种方法是可行的,下面记录附上修改后的Auth.php权限类 <?php ...

  5. css总结15:CSS3 圆角

    1 css圆角: 1.1 浏览器支持:-webkit- 或 -moz- 前面的数字表示支持该前缀的第一个版本. 1.2 属性 border-radius: 代码如下: #rcorners1 { bor ...

  6. Unity3D面试题整合

    第一部分 1. 请简述值类型与引用类型的区别答:区别:1.值类型存储在内存栈中,引用类型数据存储在内存堆中,而内存单元中存放的是堆中存放的地址.2.值类型存取快,引用类型存取慢.3.值类型表示实际数据 ...

  7. SQL之TCL

    TCL(Transaction Control Language)事务控制语言 COMMIT  提交SAVEPOINT 设置保存点ROLLBACK  回滚SET TRANSACTION

  8. Delphi7中的Char和XE中的Char

    我用FillChar()函数时,发现两个版本中的Char不一样. 在delphi7中 procedure TForm2.Button1Click(Sender: TObject); var s: ar ...

  9. laravel中get方式表单提交后, 地址栏数据重复的问题

    csrf_field这个要放form表单下面第一行的位置

  10. Visual Assist X破解安装及设置

    本文提供的插件版本为Visual Assist X 10.9.2248,支持Visual Studio 2010~2017各版本,本人亲测均可正常使用. 一. 插件下载: 点击下载链接,找到对应软件下 ...