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. 手动安装pydev

    在网上下载pydev.zip,解压后有两个文件夹,features和plugins.把这两个文件夹复制到eclipse目录下的dropins文件夹下.

  2. Django实战(14):让页面联动起来

    上一节我们实现了一个”能看不能用“的购物车,现在我们来使用这个购物车. 首先是产品目录界面中的”加入购物车“链接,我们希望点击这个按钮后,在购物车中添加该产品(添加的规则是如果购物车中已经有该产品就增 ...

  3. dubbo的详细介绍

    1.背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 2.架构 单一应用架构 当网站流量很 ...

  4. 洛谷——P2083 找人

    P2083 找人 题目背景 无 题目描述 小明要到他的同学家玩,可他只知道他住在某一单元,却不知住在哪个房间.那个单元有N层(1,2……N),每层有M(1,2……M)个房间. 小明会从第一层的某个房间 ...

  5. Xamarin 2017.10.9更新

     Xamarin 2017.10.9更新 本次更新主要解决了一些bug.Visual Studio 2017升级到15.4获得新功能.Visual Studio 2015需要工具-选项-Xamarin ...

  6. github下载项目

  7. POI2018

    [BZOJ5099][POI2018]Pionek(极角排序+two pointers) 几个不会严谨证明的结论: 1.将所有向量按极角排序,则答案集合一定是连续的一段. 当答案方向确定时,则一个向量 ...

  8. Spring Boot 运作原理

    Spring Boot 运作原理 1.Spring Boot 简介 SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了 ...

  9. bzoj 2555

    暴力. 收获: 1.第一道后缀自动机,大概知道怎么写了,有一些原理性的东西还要理解. 2.计算right集合的大小 /***************************************** ...

  10. Codeforces #254 div1 B. DZY Loves FFT 暴力乱搞

    B. DZY Loves FFT 题目连接: http://codeforces.com/contest/444/problem/B Description DZY loves Fast Fourie ...