和3053差不多,把pair first做成负数就可以用大根堆维护了

注意:要开long long;比较的时候因为编号也占权重所以要比较pair;编号不是mid!不是mid!是初始输入的那个编号!搞混调了很久

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
const int N=100005,inf=1e9+7;
int n,m,rt,w;
priority_queue<pair<long long,int> >q;
map<pair<int,int>,int>mp;
struct qwe
{
long long a[2];
long long& operator [] (int x)
{
return a[x];
}
bool operator < (const qwe &b) const
{
return a[w]<b.a[w]||(a[w]==b.a[w]&&a[w^1]<b.a[w^1]);
}
}a[N],b;
struct KD
{
int ls,rs,l;
qwe d,mn,mx;
}t[N<<2];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void minn(long long &x,long long y)
{
x>y?x=y:0;
}
void maxx(long long &x,long long y)
{
x<y?x=y:0;
}
void ud(int ro)
{
if(t[ro].ls)
{
for(int i=0;i<=1;i++)
minn(t[ro].mn[i],t[t[ro].ls].mn[i]),maxx(t[ro].mx[i],t[t[ro].ls].mx[i]);
t[ro].l=min(t[ro].l,t[t[ro].ls].l);
}
if(t[ro].rs)
{
for(int i=0;i<=1;i++)
minn(t[ro].mn[i],t[t[ro].rs].mn[i]),maxx(t[ro].mx[i],t[t[ro].rs].mx[i]);
t[ro].l=min(t[ro].l,t[t[ro].rs].l);
}
}
int build(int l,int r,int f)
{
if(l>r)
return 0;
int mid=(l+r)>>1;
w=f;
nth_element(a+l,a+mid,a+r+1);
t[mid].l=mid;
t[mid].mn=t[mid].mx=t[mid].d=a[mid];
t[mid].ls=build(l,mid-1,f^1);
t[mid].rs=build(mid+1,r,f^1);
ud(mid);
return mid;
}
long long dis(qwe a,qwe b)
{
long long r=0;
for(int i=0;i<=1;i++)
r-=(a[i]-b[i])*(a[i]-b[i]);
return r;
}
pair<long long,int> wk(int ro)
{
if(!ro)
return make_pair(1ll<<60,-1<<30);
long long r=0;
for(int i=0;i<=1;i++)
r-=max((t[ro].mn[i]-b[i])*(t[ro].mn[i]-b[i]),(t[ro].mx[i]-b[i])*(t[ro].mx[i]-b[i]));
return make_pair(r,t[ro].l);
}
void ques(int ro)
{
pair<long long,int> dm=make_pair(dis(t[ro].d,b),ro),dl=wk(t[ro].ls),dr=wk(t[ro].rs);
if(dm<q.top())
q.pop(),q.push(dm);
if(dl<dr)
{
if(t[ro].ls&&dl<q.top())
ques(t[ro].ls);
if(t[ro].rs&&dr<q.top())
ques(t[ro].rs);
}
else
{
if(t[ro].rs&&dr<q.top())
ques(t[ro].rs);
if(t[ro].ls&&dl<q.top())
ques(t[ro].ls);
}
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
a[i][0]=read(),a[i][1]=read(),mp[make_pair(a[i][0],a[i][1])]=i;
rt=build(1,n,0);
m=read();
while(m--)
{
b[0]=read(),b[1]=read();
int s=read();
while(!q.empty())
q.pop();
for(int i=1;i<=s;i++)
q.push(make_pair(1ll<<60,-1<<30));
ques(rt);
printf("%d\n",mp[make_pair(t[q.top().second].d[0],t[q.top().second].d[1])]);
}
return 0;
}

bzoj 2626: JZPFAR【KD-tree】的更多相关文章

  1. bzoj 2626: JZPFAR k-D树

    题目大意: 平面上n个点,每次给出一个点,求这个点的k远点 题解: 什么叫做k远点呢... 1 2 3 4 5中5是第一远,4是第二远... 看来我语文学的不好 那么我们直接上k-D Tree求k邻近 ...

  2. 【Symmetric Tree】cpp

    题目: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). F ...

  3. 【Same Tree】cpp

    题目: Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...

  4. [BZOJ 2127] happiness 【最小割】

    题目链接:BZOJ - 2127 题目分析 首先,每个人要么学文科,要么学理科,所以可以想到是一个最小割模型. 我们就确定一个人如果和 S 相连就是学文,如果和 T 相连就是学理. 那么我们再来确定建 ...

  5. BZOJ 2626 JZPFAR(KD-tree)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2626 题意:平面上有n个点.现在有m次询问,每次给定一个点(px, py)和一个整数k, ...

  6. 【LSGDOJ1834 Tree】树链剖分

    题目描述 给定一个N个结点的无向树,树中的结点按照1...N编号,树中的边按照1...N − 1编号,每条边都赋予一个权值.你需要编写程序支持以下三种操作: 1.    CHANGE i v:将i号边 ...

  7. 【BZOJ4154】Generating Synergy【kd树】

    题意 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 分析 我们以dfs序为横坐标,深度为纵坐标,建kd树.我们每次更新,都是在kd树中更 ...

  8. 【BZOJ3489】A simple rmq problem【kd树】

    题意 给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会采取一些措施强制在线. 分析 预处理 ...

  9. 【BZOJ2716】天使玩偶【kd树】

    这个题要求kd树支持两个操作. 1.插入一个新的点. 2.查询某个点最近曼哈顿距离. 注意查询曼哈顿距离和查询欧几里得距离,是有区别的.(估价函数不同). #include <cstdio> ...

随机推荐

  1. C#语言 语句

    //有一组函数: //y=x(x<1) //y=2x-1(1<=x<10) //y=3x-11(x>=10) //括号内是x的满足条件 //实现功能,随意输出x /*Conso ...

  2. 【转载】lvs为何不能完全替代DNS轮询

    上一篇文章"一分钟了解负载均衡的一切"引起了不少同学的关注,评论中大家争论的比较多的一个技术点是接入层负载均衡技术,部分同学持这样的观点: 1)nginx前端加入lvs和keepa ...

  3. chrome自带的调试工具

    由于项目需要加载webgl对浏览器内存压力很大,需要优化内存,网上找了一下资料,极力推荐chrome的开发文档 https://developers.google.cn/web/tools/chrom ...

  4. php输出echo、print、print_r、printf、sprintf、var_dump比较

    php输出echo.print.print_r.printf.sprintf.var_dump比较 一.echo    echo() 实际上不是一个函数,是php语句,因此您无需对其使用括号.不过,如 ...

  5. ES6常用语法简介import export

    ES6常用语法简介import export let与var用法区别 //var var a = []; for (var i = 0; i < 10; i++) { a[i] = functi ...

  6. strncpy和strlen的可能的实现

    #include <stdio.h> #include <stdlib.h>//为避免与标准库中的函数发生混淆,我将它们命名为stringNCopy和stringLength ...

  7. php网站前台utf-8格式有时会出现莫名其妙的空白行,重新保存下编码格式就可以了

    php网站前台utf-8格式有时会出现莫名其妙的空白行,重新保存下编码格式就可以了.

  8. Ubuntu下如何安装并使用Objective-C

    Objective-C是本人用过的最佳类C.面向对象的编程语言.Objective-C与标准C完美兼容,而在此基础上又加上了将面向对象的基础概念诠释得最好的SmallTalk元素,使得它既简洁.又灵活 ...

  9. TTL以及LVDS接口传输【转】

    本文转载自:http://blog.csdn.net/jscese/article/details/16860833 TTL接口:属于并行方式传输数据的接口,采用这种接口时,不必在液晶显示器的驱动板端 ...

  10. YTU 2866: 结构体---点坐标结构体

    2866: 结构体---点坐标结构体 时间限制: 1 Sec  内存限制: 128 MB 提交: 499  解决: 344 题目描述 定义一个表示点坐标的结构体,输入两个点的坐标,输出这两个点中点的坐 ...