题面不符?……

#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
int n, m, nowD, rot, din, kk;
const ll oo=9e18;
struct Point{
int d[2], mn[2], mx[2], id, idmin, l, r;
int & operator[](int x){
return d[x];
}
bool operator<(const Point &x)const{
return d[nowD]<x.d[nowD];
}
}p[100005], T;
struct QueryNode{
int idx;
ll dis;
QueryNode(int id=0, ll di=0){
idx = id;
dis = di;
}
}qn[25];
bool cmp(const QueryNode &x, const QueryNode &y){
if(x.dis!=y.dis) return x.dis>y.dis;
return x.idx<y.idx;
}
struct KDTree{
Point t[100005];
void pushUp(int k){
int l=t[k].l, r=t[k].r;
t[k].idmin = t[k].id;
if(l) t[k].idmin = t[l].idmin;
if(r) t[k].idmin = t[r].idmin;
for(int i=0; i<2; i++){
t[k].mn[i] = t[k].mx[i] = t[k][i];
if(l){
t[k].mn[i] = min(t[k].mn[i], t[l].mn[i]);
t[k].mx[i] = max(t[k].mx[i], t[l].mx[i]);
}
if(r){
t[k].mn[i] = min(t[k].mn[i], t[r].mn[i]);
t[k].mx[i] = max(t[k].mx[i], t[r].mx[i]);
}
}
}
int build(int l, int r, int now){
nowD = now;
int mid=(l+r)>>1;
nth_element(p+l, p+mid, p+r+1);
t[mid] = p[mid];
if(l<mid) t[mid].l = build(l, mid-1, now^1);
if(mid<r) t[mid].r = build(mid+1, r, now^1);
pushUp(mid);
return mid;
}
ll getDis(const Point &u, const Point &v){
return (ll)(u.d[0]-v.d[0])*(u.d[0]-v.d[0])+(ll)(u.d[1]-v.d[1])*(u.d[1]-v.d[1]);
}
ll calc(int x){
ll re=0;
for(int i=0; i<2; i++){
ll tmp=max(abs(t[x].mn[i]-T[i]), abs(t[x].mx[i]-T[i]));
re += tmp * tmp;
}
return re;
}
void query(int k){
int l=t[k].l, r=t[k].r;
ll dis=getDis(t[k], T), disl=-oo, disr=-oo;
if(dis>qn[1].dis || (dis==qn[1].dis && t[k].id<qn[1].idx)){
pop_heap(qn+1, qn+1+din, cmp);
qn[din] = QueryNode(t[k].id, dis);
// cout<<t[k].id<<" as t[k].id\n";
push_heap(qn+1, qn+1+din, cmp);
}
if(l) disl = calc(l);
if(r) disr = calc(r);
if(disl>disr){
if(disl>qn[1].dis || (disl==qn[1].dis && t[l].idmin<qn[1].idx))
query(l);
if(disr>qn[1].dis || (disr==qn[1].dis && t[r].idmin<qn[1].idx))
query(r);
}
else{
if(disr>qn[1].dis || (disr==qn[1].dis && t[r].idmin<qn[1].idx))
query(r);
if(disl>qn[1].dis || (disl==qn[1].dis && t[l].idmin<qn[1].idx))
query(l);
}
}
}kdt;
int main(){
cin>>n;
for(int i=1; i<=n; i++){
scanf("%d %d", &p[i][0], &p[i][1]);
p[i].id = p[i].idmin = i;
}
rot = kdt.build(1, n, 0);
cin>>m;
while(m--){
din = 0;
scanf("%d %d %d", &T[0], &T[1], &kk);
while(kk--) qn[++din] = QueryNode(0, -oo);
kdt.query(rot);
// while(din){
// // cout<<qn[1].dis<<" "<<qn[1].idx<<" as dis&idx\n";
// pop_heap(qn+1, qn+1+din, cmp);
// din--;
// }
printf("%d\n", qn[1].idx);
}
return 0;
}

luogu2093 [国家集训队]JZPFAR的更多相关文章

  1. [国家集训队]JZPFAR

    嘟嘟嘟 k-d tree模板之二:查询第k大距离.(所以是怎么上黑的) 因为k-d tree的查询就是暴力嘛,所以我就想到了一个很暴力的做法:每一次查询用一个长度为k的优先队列维护.按距离递增,编号递 ...

  2. p2093 [国家集训队]JZPFAR

    传送门 分析 首先给大家推荐一个非常好的KDTree笔记 here 此题就是y9ong优先队列维护距离最远的k个,最后输出队首元素即可 估价函数就是max和min两点到 询问点的最远距离 代码 #in ...

  3. P2093 [国家集训队]JZPFAR(KDTree)

    传送门 类似于p4357 不过因为距离相等的时候要优先选择序号小的,所以要重载一下运算符 //minamoto #include<bits/stdc++.h> #define R regi ...

  4. luogu P2093 [国家集训队]JZPFAR

    传送门 要维护平面上点的信息,所以可以用KD-tree来维护,然后维护一个大小为\(k\)的堆,每次从根开始遍历,遇到一个点就看能不能作为前\(k\)远的点,也就是看能不能把堆中最近的点给替换掉.如果 ...

  5. [国家集训队2012]JZPFAR

    [国家集训队2012]JZPFAR 题目 平面上有n个点.现在有m次询问,每次给定一个点(px, py)和一个整数k,输出n个点中离(px, py)的距离第k大的点的标号.如果有两个(或多个)点距离( ...

  6. BZOJ 2039: [2009国家集训队]employ人员雇佣

    2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1369  Solved: 667[Submit ...

  7. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  8. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7676  Solved: 3509[Subm ...

  9. [转] ACM中国国家集训队论文集目录(1999-2009)

    国家集训队1999论文集 陈宏:<数据结构的选择与算法效率——从IOI98试题PICTURE谈起>来煜坤:<把握本质,灵活运用——动态规划的深入探讨>齐鑫:<搜索方法中的 ...

随机推荐

  1. [转]Linux中如何读写硬盘上指定物理扇区

    读指定物理扇区: dd  if=<源设备>  of=<输出设备或文件>   skip=<指定扇区值>  bs=512 count=1 写指定物理扇区: dd   i ...

  2. JAVA和数据库工具的下载地址(备用)

    sqlite数据库驱动下载: http://repo1.maven.org/maven2/org/xerial/sqlite-jdbc/

  3. meterpreter > run post/windows/capture/keylog_recorder

    meterpreter > migrate 1548[*] Migrating to 1548...[*] Migration completed successfully.meterprete ...

  4. pycharm tab换为4个空格

    Edit => find => replace 然后勾上 Regex,上一行输入 \t,下一行输入4个空格.

  5. Uploadify 3.2 参数属性、事件、方法函数详解以及配置

    一.属性 属性名称 默认值 说明 auto true 设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 . buttonClass ” 按钮样式 buttonCursor ‘ ...

  6. codeforce Gym 100425E The Street Escalator(期望,线性递推)

    算数学期望,每个人都可以分开来考虑.Xi表示第i个人跑到另外一边的次数. Xi服从二项分布.概率的和是个二项式,(p+1-p)^T,把二项式展开,p的偶次项是留在原来那一边的概率. 可以用((a+b) ...

  7. Trie:字典树

    简介 \(Trie\),又称字典树或前缀树,是一种有序树状的数据结构,用于保存关联数组,其中的键值通常是字符串. 作用 把许多字符串做成一个字符串集合,并可以对其进行快速查找(本文以求多少个单词是一个 ...

  8. 2018.6.27 Ajax实现异步刷新

    Servlet获取URL地址.在HttpServletRequest类里,有以下六个取URL的函数: getContextPath 取得项目名 getServletPath 取得Servlet名 ge ...

  9. tk.mybatis Example 多个or条件拼接

    //需要的查询条件为 a and (b or c or d) 可以转换为 (a and b) or (a and c) or (a and d) private Example madeExample ...

  10. Bootstrap历练实例:响应式标签页

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...