KD-Tree


  0.0找第k大……

  裸KD-Tree……跟之前那道找最近的k个点大同小异

  一开始理解错:第K大是第K远……不是第K近……(Tunix你个sb

  感觉容易出错的是0号点= =边界情况需要仔细处理……根据题意而定的,比如这题就必须将0号点的距离设置成最近……比如-2……(因为我一开始向堆里加的占位点的距离是-1

 /**************************************************************
Problem: 2626
User: Tunix
Language: C++
Result: Accepted
Time:12956 ms
Memory:4796 kb
****************************************************************/ //BZOJ 2626
#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
#define sqr(x) (x)*(x)
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=,INF=1e9;
/*******************template********************/
int n,m,root,D;
struct Poi{
int d[],mn[],mx[],l,r,num;
int& operator [] (int x){return d[x];}
void read(){d[]=getint();d[]=getint();}
}t[N],now; bool operator < (Poi a,Poi b) {return a[D]<b[D];}
struct node{
LL dis;int num;
node(LL d=,int n=):dis(d),num(n){}
};
bool operator < (const node &a,const node &b){
return a.dis>b.dis || (a.dis==b.dis && a.num<b.num);
}
#define L t[o].l
#define R t[o].r
#define mid (l+r>>1)
void Push_up(int o){
F(i,,){
t[o].mn[i]=min(t[o].mn[i],min(t[L].mn[i],t[R].mn[i]));
t[o].mx[i]=max(t[o].mx[i],max(t[L].mx[i],t[R].mx[i]));
}
}
int build(int l,int r,int dir){
D=dir;
nth_element(t+l,t+mid,t+r+);
int o=mid;
F(i,,) t[o].mn[i]=t[o].mx[i]=t[o][i];
if (l<mid) L=build(l,mid-,dir^);
if (r>mid) R=build(mid+,r,dir^);
Push_up(o);
return o;
} inline LL dis(Poi a,Poi b){return (LL)sqr(a[]-b[])+(LL)sqr(a[]-b[]);}
inline LL getdis(int o){
if (!o) return -;
LL ans=;
F(i,,)
ans+=max((LL)sqr(t[o].mx[i]-now[i]),(LL)sqr(t[o].mn[i]-now[i]));
return ans;
}
priority_queue<node>Q; void query(int o){
if (!o) return;
LL dl=getdis(L),dr=getdis(R),d0=dis(t[o],now);
if (d0>Q.top().dis || (d0==Q.top().dis && t[o].num<Q.top().num)){
Q.pop(); Q.push(node(d0,t[o].num));
}
if (dl>dr){
if (dl>=Q.top().dis) query(L);
if (dr>=Q.top().dis) query(R);
}else{
if (dr>=Q.top().dis) query(R);
if (dl>=Q.top().dis) query(L);
}
} int main(){
#ifndef ONLINE_JUDGE
freopen("2626.in","r",stdin);
freopen("2626.out","w",stdout);
#endif
F(i,,) t[].mn[i]=INF,t[].mx[i]=-INF;
n=getint();
F(i,,n) t[i].read(),t[i].num=i;
root=build(,n,);
int T=getint();
while(T--){
now.read(); int k=getint();
// printf("%d %d %d\n",now[0],now[1],k);
while(!Q.empty()) Q.pop();
F(i,,k) Q.push(node(-,));
query(root);
printf("%d\n",Q.top().num);
// printf("Q.size()=%d\n",Q.size());
// F(i,1,k)
// printf("%d -- %lld %lld\n",i,Q.top().dis,Q.top().num),Q.pop();
// puts("");
}
return ;
}

2626: JZPFAR

Time Limit: 50 Sec  Memory Limit: 128 MB
Submit: 665  Solved: 248
[Submit][Status][Discuss]

Description

  平面上有n个点。现在有m次询问,每次给定一个点(px, py)和一个整数k,输出n个点中离(px, py)的距离第k大的点的标号。如果有两个(或多个)点距离(px, py)相同,那么认为标号较小的点距离较大。

Input

  第一行,一个整数n,表示点的个数。
  下面n行,每行两个整数x_i, y_i,表示n个点的坐标。点的标号按照输入顺序,分别为1..n。
  下面一行,一个整数m,表示询问个数。
  下面m行,每行三个整数px_i, py_i, k_i,表示一个询问。

Output

  m行,每行一个整数,表示相应的询问的答案。

Sample Input

3
0 0
0 1
0 2
3
1 1 2
0 0 3
0 1 1

Sample Output

3
1
1

数据规模和约定
  50%的数据中,n个点的坐标在某范围内随机分布。
  100%的数据中,n<=10^5, m<=10^4, 1<=k<=20,所有点(包括询问的点)的坐标满足绝对值<=10^9,n个点中任意两点坐标不同,m个询问的点的坐标在某范围内随机分布。

HINT

Source

[Submit][Status][Discuss]

【BZOJ】【2626】JZPFAR的更多相关文章

  1. 【Bzoj 1835 基站选址】

    基站选址的区间里隐藏着DP优化的机密…… 分析:       不论是做过乘积最大还是石子合并,或者是其他的入门级别的区间DP题目的人呐,大米并认为读题后就能够轻松得出一个简洁明了的Dp转移方程.    ...

  2. 【BZOJ 2744 朋友圈】

    Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1570  Solved: 532[Submit][Status][Discuss] Descripti ...

  3. 【BZOJ 5038 不打兔子】

    Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 22  Solved: 8[Submit][Status][Discuss] Description 勤 ...

  4. 【BZOJ 1088 扫雷Mine】模拟

    http://www.lydsy.com/JudgeOnline/problem.php?id=1088 2*N的扫雷棋盘,第二列的值a[i]记录第 i 个格子和它8连通的格子里面雷的数目. 第一列的 ...

  5. 【BZOJ做题记录】07.07~?

    在NOI一周前重开一个坑 最后更新时间:7.08 07:38 7.06 下午做的几道CQOI题: BZOJ1257: [CQOI2007]余数之和sum:把k mod i写成k-k/i*i然后分段求后 ...

  6. 【bzoj5050】【bzoj九月月赛H】建造摩天楼

    讲个笑话,这个题很休闲的. 大概是这样的,昨天看到这个题,第一眼星际把题目看反了然后感觉这是个傻逼题. 后来发现不对,这个修改一次的影响是很多的,可能导致一个数突然可以被改,也可能导致一个数不能被改. ...

  7. 【BZOJ 4151 The Cave】

    Time Limit: 5 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 293  Solved: 144[Submit][Status][Di ...

  8. 【BZOJ 2458 最小三角形】

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1551  Solved: 549[Submit][Status][Discuss] Descripti ...

  9. 【BZOJ 5000 OI树】

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 107  Solved: 64[Submit][Status][Discuss] Description ...

  10. 【BZOJ 5047 空间传送装置】

    Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 282  Solved: 121[Submit][Status][Discuss] Descriptio ...

随机推荐

  1. Ionic入门十:icon(图标)

    ionic 也默认提供了许多的图标,大概有500多个.用法也非常的简单: <i class="icon ion-star"></i> 图标列表如下:   ...

  2. 重装Win7后找回Ubuntu启动项并在Ubuntu中修复引导

    1. 输入$ sudo fdisk -l 查看磁盘信息,选择Linux的磁盘,如sda10 2. 输入$ sudo -i(此步用于得到root权限,方便以下操作.) 3. 输入$ mkdir /med ...

  3. ref:关于JAVA中一些安全漏洞示例说明及如何规避方法代码示例总结分享

    ref:http://www.xwood.net/_site_domain_/_root/5870/5874/t_c268166.html 标签:安全,漏洞,健壮,java,SQL注入,SS及CSRF ...

  4. CSUOJ 1040 Round-number

    Description Most of the time when rounding a given number, it is customary to round to some multiple ...

  5. 解问 lambda表达式

    目录 1.0 何为Lambda 1.1 Lambda语法特征 1.2 Lambda实例 1.3 Lambda中的stream 1.4 Lambda 中的 stream 效率 1.0 何为Lambda ...

  6. iOS 9应用开发教程之使用代码添加按钮美化按钮

    iOS 9应用开发教程之使用代码添加按钮美化按钮 丰富的用户界面 在iOS9中提供了很多的控件以及视图来丰富用户界面,对于这些视图以及控件我们在上一章中做了简单的介绍.本章我们将详细讲解这些视图. i ...

  7. Revit二次开发示例:APIAppStartup

    下面介绍一个在Revit启动和关闭时调用外部程序的例子.   Revit调用的dll主程序: using System; using System.Collections.Generic; using ...

  8. CentOS系统php5.6安装ImageMagick处理webp格式图片

    1.先安装webp yum install libwebp 2.编译安装ImageMagick 之前有过yum安装的先卸载 yum remove ImageMagick 我使用的是老版本ImageMa ...

  9. 【Vijos 1998】【SDOI 2016】平凡的骰子

    https://vijos.org/p/1998 三维计算几何. 需要混合积求四面体体积: 四面体剖分后合并带权重心求总重心: 四面体重心的横纵坐标是四个顶点的横纵坐标的平均数: 三维差积求平面的法向 ...

  10. ARC 101 D - Median of Medians

    题面在这里! 这种题只能二分答案把qwwq,直接做根本做不了啊... 首先你需要知道如何通过 一个区间<=x的数有多少个 来判断x和这个区间中位数的关系. 很显然当数有至少 [L/2]+1 个( ...