题意:

  二维平面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. mysqli的增强功能

    批量执行sql语句 批量执行dml语句 基本语法 $sqls="sql1.sql2.sql3...." mysqli::multi_query($sqls) 案例: $mysqli ...

  2. 数据库支持emoji表情

    从MySQL5.5.3开始,MySQL 支持一种utf8mb4的字符集,这个字符集能够支持4字节的UTF8编码的字符.utf8mb4字符集能够完美地兼容utf8字符串.在数据存储方面,当一个普通中文字 ...

  3. CSS3–2.css3 响应式布局

    1.响应式布局 响应式布局是现在很流行的一个设计理念,随着移动互联网的盛行,为解决如今各式各样的浏览器分辨率以及不同移动设备的显示效果,设计师提出了响应式布局的设计方案.所谓的响应式布局,就是一个网站 ...

  4. 使用Autofac在ASP.NET Web API上实现依赖注入

    在ASP.NET Web API里使用Autofac 1.通过NuGet安装Autofac.WebApi(当时安装的是Autofac 3.1.0) PM > Install-Package Au ...

  5. jQuery ajax同步的替换方法,使用 $.Deferred()对象

    function aa() { var defer = $.Deferred(); $.ajax({ url: "/Handler1.ashx", type: "post ...

  6. python中最简单的多进程程序

    学着.. #!/usr/bin/env python # -*- coding: utf-8 -*- # Spawn a Process: Chapter 3: Process Based Paral ...

  7. MVA Universal Windows Apps系列学习笔记1

    昨天晚上看了微软的Build 2015大会第一天第一场演讲,时间还挺长,足足3个小时,不过也挺震撼的.里面提到了windows 10.Microsoft edge浏览器.Azure云平台.Office ...

  8. <转>WCF中出现死锁或者超时

    WCF回调中的死锁 一.服务器端死锁 对于如下服务: [ServiceContract(CallbackContract = typeof(INotify))] public class Downlo ...

  9. WPF中加载高分辨率图片性能优化

    在最近的项目中,遇到一个关于WPF中同时加载多张图片时,内存占用非常高的问题. 问题背景: 在一个ListView中同时加载多张图片,注意:我们需要加载的图片分辨率非常高. 代码: XAML: < ...

  10. hdu 4036 2011成都赛区网络赛F 模拟 **

    为了确保能到达终点,我们需要满足下面两个条件 1.能够到达所有山顶 2.能够在遇到苦土豆时速度大于他 二者的速度可以用能量守恒定律做,苦土豆的坐标可通过三角形相似性来做 #include<cst ...