平面上有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. ubuntu启动报/root/.profile mesg:ttyname failed错误的解决办法

    修改/root/.profile文件,如下命令 sudo gedit /root/profile 将文中的最后一行mesg n修改成tty -s && mesg n

  2. 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类

    依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依 ...

  3. WPF 自定义Calendar样式(日历样式,周六周日红色显示)

    一.WPF日历控件基本样式 通过Blend获取到Calendar需要设置的三个样式CalendarStyle.CalendarButtonStyle.CalendarDayButtonStyle.Ca ...

  4. Extensions in UWP Community Toolkit - FrameworkElement Extensions

    概述 UWP Community Toolkit Extensions 中有一个为FrameworkElement 提供的扩展 - FrameworkElement Extensions,本篇我们结合 ...

  5. ios开发常识(1)开发语言和参考资料

    学iphone开发用的语言是object-c,object-c和c++,java还是有很大区别,如果你坚持学习iphone开发的话可以不学c++,java,直接学习这个语言,先入为主,可能觉得这个语言 ...

  6. SpringCloud的配置管理:Spring Cloud Config

    演示如何使用ConfigServer提供统一的参数配置服务 ###################################################################一.概 ...

  7. logback中配置的日志文件的生成地址

    配置文件如下 <?xml version="1.0" encoding="UTF-8"?> <configuration debug=&quo ...

  8. [模板][Luogu3387] 缩点 - Tarjan, 拓扑+DP

    Description 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次 ...

  9. SpringMVC(十二):SpringMVC 处理输出模型数据之@ModelAttribute

    Spring MVC提供了以下几种途径输出模型数据:1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据:2)Map及Model:处理方法入参 ...

  10. React-Native(五):React Native之Text学习

    本章节主要学习Text的布局,仿照网易新网: 代码: /** * Sample React Native App * https://github.com/facebook/react-native ...