平面上有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. 用python实现简单购物车功能

    all_asset = 0 i1 = input("请输入总资产:") all_asset = int(i1) goods = [ {'name':'电脑','price':199 ...

  2. Flask 学习 七 用户认证

    使用werkzeug 实现密码散列 from werkzeug.security import generate_password_hash,check_password_hash class Use ...

  3. sql 用临时表时报错 "Chinese_PRC_90_CI_AI" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突

    在用临时表关联数据库中的表做关联查询时,如果报这种情况的话,就要把临时表和关联的表的排序规则统一掉. LEFT JOIN #tsub ON #tsub.joinjarno collate Chines ...

  4. ThreadLocal源码分析:(二)get()方法

    在ThreadLocal的get(),set()的时候都会清除线程ThreadLocalMap里所有key为null的value. 而ThreadLocal的remove()方法会先将Entry中对k ...

  5. Sphinx主索引和增量索引来实现索引实时更新的关键步骤

    1.配置csft.conf文件 vim /etc/csft.conf # # Minimal Sphinx configuration sample (clean, simple, functiona ...

  6. dubbo的InvocationChain

    个人觉得dubbo比较好的设计是:一个是Cooma微容器设计.另一个就是InvocationChain了 Cooma微容器是自己实现了一套SPI,方便了用户做扩展: InvocationChain类似 ...

  7. Django之中间件

    中间件简介 什么是中间件 中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功 ...

  8. Mac 中配置Apache

    使用的mac版本是10.10.1,mac自带的Apache环境 分为两部分: 1.启动Apache 2.设置虚拟主机 启动Apache 打开终端, >>sudo apachectl -v, ...

  9. 前端之BOM和DOM

    BOM和DOM简介 BOM(Browser Object Model)是指浏览器对象模型,它使JavaScript有能力与浏览器进行“对话”. DOM(Document Object Model)是指 ...

  10. jdk的server模式修改无效(关于client和server模式)

    本机为64位操作系统,64位jdk,win10. 修改C:\Program Files\Java\jre8\lib\amd64\jvm.cfg无效. 我的文件的内容为: 原因参考如下: http:// ...