平面上有n个点,要求支持插入一个点和查询一个点的最近点距离 n,m<=500000

用kdtree实现,但是复杂度貌似没法保证.....(莫名加了替罪羊重建更慢了...)

#include<iostream>
#include<cstdio>
#include<algorithm>
#define INF 2000000000
#define MN 1000000
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
}
int n,now,m;
inline int abs(int x){return x<?-x:x;}
struct P{
int d[],mx[],mn[],l,r;
int& operator[](int x){return d[x];}
bool operator<(const P&x)const{return d[now]<x.d[now];}
friend int dis(P x,P y){return abs(x.d[]-y.d[])+abs(x.d[]-y.d[]);}
}t[MN+]; struct KD_TREE{
P p[MN+],T;int ans;
void update(int x)
{
int l=p[x].l,r=p[x].r;
for(int i=;i<;i++)
{
if(l) p[x].mn[i]=min(p[x].mn[i],p[l].mn[i]),
p[x].mx[i]=max(p[x].mx[i],p[l].mx[i]);
if(r) p[x].mn[i]=min(p[x].mn[i],p[r].mn[i]),
p[x].mx[i]=max(p[x].mx[i],p[r].mx[i]);
}
}
void ins(int x,int th)
{
if(T[th]>=p[x][th])
{
if(p[x].r) ins(p[x].r,th^);
else
{
int r=p[x].r=++n;p[r]=T;
for(int i=;i<;i++)
p[r].mn[i]=p[r].mx[i]=T[i];
}
}
else
{
if(p[x].l) ins(p[x].l,th^);
else
{
int l=p[x].l=++n;p[l]=T;
for(int i=;i<;i++)
p[l].mn[i]=p[l].mx[i]=T[i];
}
}
update(x);
}
int getmn(P x)
{
int sum=;
for(int i=;i<;i++)
{
sum+=max(x.mn[i]-T[i],);
sum+=max(T[i]-x.mx[i],);
}
return sum;
}
int build(int l,int r,int th)
{
int mid=l+r>>;now=th;
nth_element(t+l,t+mid,t+r+);
p[mid]=t[mid];
for(int i=;i<;i++)
p[mid].mx[i]=p[mid].mn[i]=p[mid][i];
if(l<mid) p[mid].l=build(l,mid-,th^);
if(mid<r) p[mid].r=build(mid+,r,th^);
update(mid);
return mid;
}
void querymn(int k)
{
ans=min(ans,dis(p[k],T));
int dl=INF,dr=INF;
if(p[k].l) dl=getmn(p[p[k].l]);
if(p[k].r) dr=getmn(p[p[k].r]);
if(dl>dr)
{
if(dr<ans) querymn(p[k].r);
if(dl<ans) querymn(p[k].l);
}
else
{
if(dl<ans) querymn(p[k].l);
if(dr<ans) querymn(p[k].r);
}
}
}kd;
int rt,ans=INF; int main()
{
n=read();m=read();
for(int i=;i<=n;i++)
t[i][]=read(),t[i][]=read();
rt=kd.build(,n,);
for(int i=;i<=m;i++)
{
int op=read();kd.T[]=read();kd.T[]=read();
if(op==) kd.ins(rt,);
else
{
kd.ans=INF;kd.querymn(rt);
printf("%d\n",kd.ans);
}
}
return ;
}

[bzoj2648/2716]SJY摆棋子的更多相关文章

  1. [bzoj2648/2716]SJY摆棋子_KD-Tree

    SJY摆旗子 bzoj-2648 题目大意:平面上有n个黑子.有m个操作,可以下一颗白子,查询与曼哈顿距离下最近黑子之间的曼哈顿距离,或者下一颗黑子. 注释:$1\le n,m\le 5\cdot 1 ...

  2. BZOJ2648/2716:SJY摆棋子/[Violet]天使玩偶(K-D Tree)

    Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子. ...

  3. 【BZOJ2648】SJY摆棋子(KD-Tree)

    [BZOJ2648]SJY摆棋子(KD-Tree) 题面 BZOJ Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一 ...

  4. 【BZOJ2648】SJY摆棋子 KDtree

    [BZOJ2648]SJY摆棋子 Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找 ...

  5. 【BZOJ2648】SJY摆棋子 [KD-tree]

    SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 这天,SJY显得无聊.在家自己 ...

  6. 【bzoj2648】 SJY摆棋子

    http://www.lydsy.com/JudgeOnline/problem.php?id=2648 (题目链接) 题意 动态维护二维平面上的点的插入以及最邻近域搜索. Solution KDtr ...

  7. 【BZOJ2648】SJY摆棋子

    题目大意:维护一个二维平面,平面上初始有 N 个点,支持两种操作:平面加点.查询距离某个指定点的最小哈密顿距离. 题解:学习到了 kd-tree 数据结构. kd-tree 类似于平衡树,即:每个节点 ...

  8. BZOJ2648:SJY摆棋子

    浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...

  9. 【bzoj2648】SJY摆棋子(kdtree)

    传送门 题意: 二维平面上有若干个点. 现在要维护一种数据结构,支持插入一个点以及询问其余点到某个点的最小曼哈顿距离. 思路: 这是个\(kdtree\)模板题. \(kdtree\)是一种可以高效处 ...

随机推荐

  1. bzoj千题计划274:bzoj3779: 重组病毒

    http://www.lydsy.com/JudgeOnline/problem.php?id=3779 有一棵树,初始每个节点有不同的颜色 操作1:根节点到x的路径上的点 染上一种没有出现过的颜色 ...

  2. Pandas速查手册中文版

    本文翻译自文章: Pandas Cheat Sheet - Python for Data Science ,同时添加了部分注解. 对于数据科学家,无论是数据分析还是数据挖掘来说,Pandas是一个非 ...

  3. javascript单例模式及开发实践

    定义: 保证一个对象(类)仅有一个实例,并提供一个访问它的全局访问点: 实现原理: 利用闭包来保持对一个局部变量的引用,这个变量保存着首次创建的唯一的实例; 主要用于: 全局缓存.登录浮窗等只需要唯一 ...

  4. Code::Blocks出现64-Bit mode not compled in解决方法

    原因是:Settings->compilter你选了Target x86 _64(64bit),选择Target x86 _32(32bit)即可 废了老半天劲才找到原因,希望能让朋友们少走弯路

  5. Linux知识积累(6) 系统目录及其用途

    linux系统常见的重要目录以及各个目作用:/ 根目录.包含了几乎所有的文件目录.相当于中央系统.进入的最简单方法是:cd /./boot引导程序,内核等存放的目录.这个目录,包括了在引导过程中所必需 ...

  6. spring-oauth-server实践:access_token的有效期分析

    1.access_token有效期检查 用expiration和new Date()比较!!!!!! 分析目标-->expiration什么时候设置,设置规则如何配置!!!!!!! 2.acce ...

  7. python入门(11)条件判断和循环

    python入门(11)条件判断和循环 条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现: ag ...

  8. .NET CORE 框架ABP的代码生成器(ABP Code Power Tools )使用说明文档

    前言 各位好,又是一个多月没更新文章了. 原因嘛,大家都懂的,太忙了~ 临近年末,公司的项目.年会的做技术支持,同事朋友聚餐也比较频繁. 当然视频教程也没有继续更新.我的锅~ 但是这个月好歹抽空做了一 ...

  9. 测试驱动开发实践4————testSave之新增文档分类

    [内容指引] 1.确定"新增文档分类"的流程及所需的参数 2.根据业务规则设计测试用例 3.为测试用例赋值并驱动开发 一.确定"新增文档分类"的流程及所需的参数 ...

  10. MyBatis(一):配置并使用

    MyBatis具体是什么东东,这些在后边在研究吧,本文目的是为了记录如何使用MyBatis. 首先,需要下载MyBatis开发所需要文件. 通过github上可以找到MyBatis代码:https:/ ...