题意:

  二维平面n个点 每次给出一个点询问距离第k小的点.

SOL:

  kdtree裸题,抄了一发别人的模板...二维割起来还是非常显然的.膜rzz的论文.

  不多说了吧....

Code:

  

/*==========================================================================
# Last modified: 2016-03-18 20:26
# Filename: 2626.cpp
# Description:
==========================================================================*/
#define me AcrossTheSky
#include <cstdio>
#include <cmath>
#include <ctime>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> #include <set>
#include <map>
#include <stack>
#include <queue>
#include <vector> #define lowbit(x) (x)&(-x)
#define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++)
#define FORP(i,a,b) for(int i=(a);i<=(b);i++)
#define FORM(i,a,b) for(int i=(a);i>=(b);i--)
#define ls(a,b) (((a)+(b)) << 1)
#define rs(a,b) (((a)+(b)) >> 1)
#define getlc(a) ch[(a)][0]
#define getrc(a) ch[(a)][1] #define maxn 100000
#define maxm 100000
#define pi 3.1415926535898
#define _e 2.718281828459
#define INF 1070000000
using namespace std;
typedef long long LL;
typedef unsigned long long uLL; template<class T> inline
void read(T& num) {
bool start=false,neg=false;
char c;
num=0; while((c=getchar())!=EOF) {
if(c=='-') start=neg=true;
else if(c>='0' && c<='9') {
start=true;
num=num*10+c-'0';
} else if(start) break;
}
if(neg) num=-num;
}
/*==================split line==================*/
int flag;
struct node{
int id;
LL x,y;
void in(int i){
read(x); read(y);
id=i;
}
bool operator<(const node& a)const{
if(!flag) return x<a.x;
return y<a.y;
}
}p[maxn];
LL sqr(LL x){return x*x;}
LL dist(node a,node b){return sqr(a.x-b.x)+sqr(a.y-b.y);} struct cpt{
LL dis;
int id;
bool operator<(const cpt &a)const{
if(dis!=a.dis) return dis>a.dis;
return id<a.id;
}
}; priority_queue<cpt> q; struct KD{
LL minv[2],maxv[2];
LL dis(node p){
LL x=max(abs(p.x-minv[0]),abs(p.x-maxv[0]));
LL y=max(abs(p.y-minv[1]),abs(p.y-maxv[1]));
return sqr(x)+sqr(y);
}
KD operator+(const KD &a){
KD c;
c.minv[0]=min(minv[0],a.minv[0]);
c.minv[1]=min(minv[1],a.minv[1]);
c.maxv[0]=max(maxv[0],a.maxv[0]);
c.maxv[1]=max(maxv[1],a.maxv[1]);
return c;
}
}; struct KDtree{
node p;KD c;
}tree[maxn];
int n,m,kth,ch[maxn][2],tot; int build(int l,int r,int k){
int x=++tot;
flag=k;
int mid=rs(l,r); nth_element(p+l,p+mid,p+r+1);
tree[x].p=p[mid];
tree[x].c.minv[0]=tree[x].c.maxv[0]=tree[x].p.x;
tree[x].c.minv[1]=tree[x].c.maxv[1]=tree[x].p.y;
if (l<=mid-1){
ch[x][0]=build(l,mid-1,k^1);
tree[x].c=tree[x].c+tree[ch[x][0]].c;
}
if (mid+1<=r){
ch[x][1]=build(mid+1,r,k^1);
tree[x].c=tree[x].c+tree[ch[x][1]].c;
}
return x;
}
void ask(int x,node a,int k){
cpt tmp=(cpt){dist(tree[x].p,a),tree[x].p.id};
int lc=ch[x][0],rc=ch[x][1];
flag=k;
if (q.size()<kth) q.push(tmp);
else if (tmp<q.top()){q.pop(); q.push(tmp);}
if (a<tree[x].p) swap(lc,rc);
if (lc && (q.size()<kth || tree[lc].c.dis(a)>=q.top().dis))
ask(lc,a,k^1);
if (rc && (q.size()<kth || tree[rc].c.dis(a)>=q.top().dis))
ask(rc,a,k^1);
}
int main(){
//freopen("a.in","r",stdin);
read(n);
FORP(i,1,n) p[i].in(i);
build(1,n,0);
int m; read(m);
FORP(i,1,m){
node a; a.in(i);
read(kth);
while (!q.empty()) q.pop();
ask(1,a,0);
printf("%d\n",q.top().id);
}
}

BZOJ 2626 & KDtree的更多相关文章

  1. BZOJ 2626 JZPFAR(KD-tree)

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

  2. BZOJ 2626: JZPFAR KDtree + 堆

    Code: #include<bits/stdc++.h> #define maxn 200000 #define inf 1000000000000000 #define mid ((l ...

  3. bzoj 2626: JZPFAR【KD-tree】

    和3053差不多,把pair first做成负数就可以用大根堆维护了 注意:要开long long:比较的时候因为编号也占权重所以要比较pair:编号不是mid!不是mid!是初始输入的那个编号!搞混 ...

  4. bzoj 2648 KD-tree

    稍微看了一下KD-tree的讲义,大概明白了它的原理,但是实现不出来... 所以无耻的抄了一下黄学长的... #include<iostream> #include<cstdio&g ...

  5. BZOJ 2648 kd-tree模板

    学习了一下kd-tree的基本写法 http://blog.csdn.net/jiangshibiao/article/details/34144829 配合 http://www.bilibili. ...

  6. BZOJ 4154 kd-tree dfs序 + 二维空间的区间(矩阵)更新单点查找

    一开始没思路 感觉像是一个树形dp 然而不会 然后看了一眼题解就明白了 一个点的子树 用dfs序表示肯定是一个连续的区间 并且由于有子树的距离限制 可以转化为一个深度的区间 于是每个点都会有一个在二维 ...

  7. BZOJ 4066 kd-tree 矩形询问求和

    第一次遇见强制在线的题目 每个操作都和前面的ans有关 所以不能直接离线做 在这个问题中 kdtree更像一个线段树在一维单点修改区间询问的拓展一样 如果区间被询问区间完全包含 就不用继续递归 插入时 ...

  8. bzoj 5355 kdtree 树链剖分

    https://www.lydsy.com/JudgeOnline/problem.php?id=5355 想在b站搜query on a tree系列不小心看到了这题 扑鼻而来的浓浓的OI风格的题面 ...

  9. 【24.91】【Tsinsen 1302】&【BZOJ 2626】JZPFAR

    时间限制:5.0s   内存限制:256.0MB   总提交次数:547   AC次数:137   平均分:40.31 将本题分享到:        查看未格式化的试题   提交   试题讨论 试题来 ...

随机推荐

  1. LR结果分析——TPS和吞吐率

    针对吞吐率和TPS的关系,这个在结果分析中如何使用,就个人经验和朋友讨论后,提出如下建议指导,欢迎同僚指正. TPS:transaction per second 服务器每秒处理的事务数. 吞吐率:测 ...

  2. selenium--python如何定位一组元素并返回文本值

    from selenium import webdriverimport time a=[] #创建一个空列表用于存储查询到的元素组driver = webdriver.Firefox()driver ...

  3. js自定义延迟执行函数

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  4. MongoDB的介绍和使用场景(1)

    MongoDB 是一个高性能,开源,无模式的文档型数据库,是当前 NoSQL 数据库产品中最热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式,MongoDB 使用 C++开发.M ...

  5. 【转载】 Python 方法参数 * 和 **

    Python的函数定义中有两种特殊的情况,即出现*,**的形式. 如:def myfun1(username, *keys)或def myfun2(username, **keys)等. 他们与函数有 ...

  6. 玩玩Excel下的Power View

    作为微软平台下的数据展示工具,Power View是一个不错的选择.而在Excel 2013下,即使你没有SharePoint的实例那么你也可以玩转它.此篇讲对Excel 2013下的Power Vi ...

  7. PHP+MYSQL+AJAX实现每日签到功能

    一.web前端及ajax部分 文件index.html <html> <head> <meta http-equiv=Content-Type content=" ...

  8. hdu 4050 2011北京赛区网络赛K 概率dp ***

    题目:给出1-n连续的方格,从0开始,每一个格子有4个状态,左右脚交替,向右跳,而且每一步的步长必须在给定的区间之内.当跳出n个格子或者没有格子可以跳的时候就结束了,求出游戏的期望步数 0:表示不能到 ...

  9. App界面交互设计规范

    策划007-App界面交互设计规范 字数1805 阅读3544 评论20 喜欢154 交互设计规范 在上篇<策划006-APP界面设计风格>确定下来后,产品经理(兼交互设计)还不用着急将所 ...

  10. visio如何让动态连接线的单箭头变成双箭头?

    1 选中线,右击,然后选择“格式”,“线条” 2 3