[国家集训队2012]JZPFAR

题目

平面上有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

OUTPUT

3
1
1

解题报告

首道K-D树

然而只是照着打了个板子QAQ

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
typedef long long L;
const L inf((L)1e16);
int now,n,m,k;
inline int read(){
int sum(),f();
char ch(getchar());
for(;ch<''||ch>'';ch=getchar())
if(ch=='-')
f=-;
for(;ch>=''&&ch<='';sum=sum*+(ch^),ch=getchar());
return sum*f;
}
struct point{
L a[];
inline bool operator<(const point &b)const{
return a[now]<b.a[now]||(a[now]==b.a[now]&&a[now^]<b.a[now^]);
}
L &operator[](int x){
return a[x];
}
}p[],cmp;
struct data{
L dis,id;
inline bool operator<(const data &a)const{
return dis==a.dis?id<a.id:dis>a.dis;
}
};
priority_queue<data>q;
inline L pf(L x){
return x*x;
}
inline L dis(point x,point y){
return pf(x[]-y[])+pf(x[]-y[]);
}
struct node{
node *lch,*rch;
point key;
int mn[],mx[];
node(point &x):key(x),lch(NULL),rch(NULL){
mn[]=mx[]=x[];
mn[]=mx[]=x[];
}
inline void pushup(node *x){
if(x==NULL)
return;
mn[]=min(mn[],x->mn[]),mn[]=min(mn[],x->mn[]);
mx[]=max(mx[],x->mx[]),mx[]=max(mx[],x->mx[]);
}
inline L cal_dis(){
L ret();
ret=max(ret,dis((point){mn[],mn[]},cmp));
ret=max(ret,dis((point){mn[],mx[]},cmp));
ret=max(ret,dis((point){mx[],mn[]},cmp));
ret=max(ret,dis((point){mx[],mx[]},cmp));
return ret;
}
}*root;
inline void build(node *&rt,int l,int r,int d){
if(l>r)
return;
int mid((l+r)>>);
now=d;
nth_element(p+l,p+mid,p+r+);
rt=new node(p[mid]);
build(rt->lch,l,mid-,d^);
build(rt->rch,mid+,r,d^);
rt->pushup(rt->lch);
rt->pushup(rt->rch);
}
inline void query(node *rt){
if(rt==NULL)
return;
if(q.size()==k&&rt->cal_dis()<q.top().dis)
return;
data ret((data){dis(rt->key,cmp),rt->key[]});
if(q.size()<k)
q.push(ret);
else
if(ret<q.top())
q.pop(),q.push(ret);
L dis_l(rt->lch==NULL?inf:rt->lch->cal_dis());
L dis_r(rt->rch==NULL?inf:rt->rch->cal_dis());
if(dis_l>dis_r){
query(rt->lch);
if(dis_r>=q.top().dis||q.size()<k)
query(rt->rch);
}
else{
query(rt->rch);
if(dis_l>=q.top().dis||q.size()<k)
query(rt->lch);
}
}
inline int gg(){
freopen("jzpfar.in","r",stdin);
freopen("jzpfar.out","w",stdout);
n=read();
for(int i=;i<=n;++i)
p[i][]=read(),p[i][]=read(),p[i][]=i;
build(root,,n,);
m=read();
while(m--){
cmp[]=read(),cmp[]=read(),k=read();
while(!q.empty())
q.pop();
query(root);
printf("%d\n",q.top().id);
}
return ;
}
int K(gg());
int main(){;}

最新文章

  1. cf Round 633
  2. Android微信智能心跳方案 (转)
  3. 编写高质量代码改善C#程序的157个建议[优先考虑泛型、避免在泛型中声明静态成员、为泛型参数设定约束]
  4. cocos2d-x创建精灵动画方式汇总
  5. 在云服务器搭建WordPress博客(六)发布和管理文章
  6. 离线应用Application Cache详解
  7. axel源码学习(0)&mdash;&mdash;程序逻辑
  8. 启动 XPs 代理
  9. wsdlLocation可以写成项目的相对路劲吗
  10. DeDe友情链接
  11. codeforces 459D - Pashmak and Parmida&amp;#39;s problem【离散化+处理+逆序对】
  12. [NLP自然语言处理]计算熵和KL距离,java实现汉字和英文单词的识别,UTF8变长字符读取
  13. Oracle 11g完全卸载方案(注册表清理)
  14. 伙伴系统之伙伴系统概述--Linux内存管理(十五)
  15. Python学习—数据库篇之索引
  16. Oracle:如何创建一个只有查看权限的用户
  17. 开机出现grub界面(待尝试)
  18. ajax代码整理
  19. mybatis BigDecimal Double Long 的坑爹事
  20. java 局部内部类

热门文章

  1. java dom4j 读写XML
  2. 解决openresty http客户端不支持https的问题
  3. [Django基础] gunicorn启动django时静态文件的加载
  4. 2-1 创建第一个Vue实例
  5. [Swift通天遁地]四、网络和线程-(15)程序内购功能
  6. redis-缓存穿透,缓存雪崩,缓存击穿,并发竞争
  7. Java转大数据开发全套视频资料
  8. Sorting It All Out 拓扑排序+确定点
  9. [Luogu 1052] noip 05 过河
  10. 1CSS简介