平面上有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. 在ArcGIS中导出现有mxd的style文件

     做好的地图包含许多地图符号,这是之前花了很多功夫做的,怎么把它导出来再用呢?     在ArcGIS中右键工具栏,customize,选择command选项卡,在搜索框中输入style ,选择too ...

  2. 一个页面多个HTTP请求 页面卡顿!

    用promise解决 前两天面试的时候 一个面试官问到这样一个问题 这里先说出解决的路径 这几天会更新具体的做法 或者直接参考廖雪峰大神 地址如下: https://www.liaoxuefeng.c ...

  3. 剑指offer-删除链表中重复的节点

    题目描述   在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处 ...

  4. C#-获取字符的GBK编码值

    public static int GetGBKValue(string key) { byte[] gbk = Encoding.GetEncoding("GBK").GetBy ...

  5. AngularJS1.X学习笔记13-路由

    ThinkPHP框架有路由的概念,看起来路由更多的是后端的事情,Angular怎么也会跑出个路由呢?事实上,Angular是着眼于单页应用的,他的一个应用一般来说是一个页面,你所看到的页面内容的改变, ...

  6. 新概念英语(1-101)A Card From Jimmy

    Lesson 101 A card from Jimmy 吉米的明信片 Listen to the tape then answer this question. Does Grandmother s ...

  7. ELK学习总结(2-4)bulk 批量操作-实现多个文档的创建、索引、更新和删除

    bulk 批量操作-实现多个文档的创建.索引.更新和删除 ----------------------------------------------------------------------- ...

  8. Spring Security 入门(1-4-1)Spring Security - 认证过程

    理解时可结合一下这位老兄的文章:http://www.importnew.com/20612.html 1.Spring Security的认证过程 1.1.登录过程 - 如果用户直接访问登录页面 用 ...

  9. Java并发编程:synchronized和锁优化

    1. 使用方法 synchronized 是 java 中最常用的保证线程安全的方式,synchronized 的作用主要有三方面: 确保线程互斥的访问代码块,同一时刻只有一个方法可以进入到临界区 保 ...

  10. requests.post发送字典套字典

    import requests import json a = { "data": { "project": { "url": " ...