题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648

学习资料:https://blog.csdn.net/zhl30041839/article/details/9277807

https://www.cnblogs.com/galaxies/p/kdtree.html

模仿代码:https://blog.csdn.net/lych_cys/article/details/50809141

那个求点到块的距离的方法挺妙的。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define mid ((l+r)>>1)
using namespace std;
int const xn=5e5+,inf=1e9;
int n,m,rt,cnt,dm,c[xn<<][],ans;
struct N{int mn[],mx[],p[];}a[xn],t[xn<<];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int Min(int x,int y){return x<y?x:y;}
int Max(int x,int y){return x<y?y:x;}
int Abs(int x){return x>?x:-x;}
bool cmp(N a,N b){return a.p[dm]<b.p[dm];}
void turn(int x,N y){for(int i=;i<;i++)t[x].mn[i]=t[x].mx[i]=t[x].p[i]=y.p[i];}
void pushup(int x)
{
int ls=c[x][],rs=c[x][];
for(int i=;i<;i++)
{
if(ls)t[x].mn[i]=Min(t[x].mn[i],t[ls].mn[i]),t[x].mx[i]=Max(t[x].mx[i],t[ls].mx[i]);
if(rs)t[x].mn[i]=Min(t[x].mn[i],t[rs].mn[i]),t[x].mx[i]=Max(t[x].mx[i],t[rs].mx[i]);
}
}
void build(int &x,int l,int r,int nw)
{
x=++cnt; dm=nw;
nth_element(a+l,a+mid,a+r+,cmp);
turn(x,a[mid]);
if(mid>l)build(c[x][],l,mid-,nw^);
if(mid<r)build(c[x][],mid+,r,nw^);
pushup(x);
}
void ins(int x,N v,int nw)
{
if(v.p[nw]<=t[x].p[nw])
{
if(c[x][])ins(c[x][],v,nw^);
else c[x][]=++cnt,turn(c[x][],v);
}
else
{
if(c[x][])ins(c[x][],v,nw^);
else c[x][]=++cnt,turn(c[x][],v);
}
pushup(x);
}
int dis(int x,N y)
{
int ret=;
for(int i=;i<;i++)
ret+=Max(,t[x].mn[i]-y.p[i]),ret+=Max(,y.p[i]-t[x].mx[i]);
return ret;
}
int query(int x,N v)
{
ans=min(ans,Abs(t[x].p[]-v.p[])+Abs(t[x].p[]-v.p[]));
int d1=(c[x][]?dis(c[x][],v):inf),d2=(c[x][]?dis(c[x][],v):inf);
if(d1<=d2){if(d1<ans)query(c[x][],v); if(d2<ans)query(c[x][],v);}
else {if(d2<ans)query(c[x][],v); if(d1<ans)query(c[x][],v);}
}
int main()
{
n=rd(); m=rd(); N tmp;
for(int i=;i<=n;i++)a[i].p[]=rd(),a[i].p[]=rd();
build(rt,,n,);
for(int i=,op;i<=m;i++)
{
op=rd(); tmp.p[]=rd(); tmp.p[]=rd();
if(op==)ins(rt,tmp,);
else ans=inf,query(rt,tmp),printf("%d\n",ans);
}
return ;
}

bzoj 2648 SJY摆棋子 —— K-D树的更多相关文章

  1. BZOJ 2648 SJY摆棋子(KD树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2716 [题目大意] 给出一些点,同时不断插入点和询问某点离插入点最近距离 [题解] 我 ...

  2. BZOJ 2648: SJY摆棋子

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2968  Solved: 1011[Submit][Status][Disc ...

  3. BZOJ 2648: SJY摆棋子 kdtree

    2648: SJY摆棋子 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2648 Description 这天,SJY显得无聊.在家自己玩 ...

  4. bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree

    2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec  Memory Limit: 128 MB Description 这天,S ...

  5. bzoj 2648 SJY摆棋子 kd树

    题目链接 初始的时候有一些棋子, 然后给两种操作, 一种是往上面放棋子. 另一种是给出一个棋子的位置, 问你离它最近的棋子的曼哈顿距离是多少. 写了指针版本的kd树, 感觉这个版本很好理解. #inc ...

  6. BZOJ 2648: SJY摆棋子(K-D Tree)

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 6051  Solved: 2113[Submit][Status][Discuss] Descript ...

  7. BZOJ 2648 SJY摆棋子(KD Tree)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2648 题意: 思路: KDtree模板题. 参考自http://www.cnblogs.com/ra ...

  8. bzoj 2648 SJY摆棋子——KDtree

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648 第一道KDtree! 学习资料:https://blog.csdn.net/zhl30 ...

  9. bzoj 2648: SJY摆棋子【KD-tree】

    其实理论上cdq更优 核心是依次取x值.y值的mid作为当前节点,向两边递归建立二叉树,树上维护size:子树大小:mx[0/1]:子树内最大x/y:mn[0/1]:子树内最小x/y:d[0/1]:这 ...

随机推荐

  1. Wrapper配置详解及高级应用

      将一个简单的程度如HelloWorld 的应用包装秤Wrapper 服务并不复杂,甚至可以认为非常简单.但是实际项目应用过程中我们的程序一般较庞大,运行环境也较复杂. 通过Wrapper 配置文件 ...

  2. java 分布式锁 -图解- 秒懂

    目录 写在前面 1.1. 分布式锁 简介 1.1.1. 图解:公平锁和可重入锁 模型 1.1.2. 图解: zookeeper分布式锁的原理 1.1.3. 分布式锁的基本流程 1.1.4. 加锁的实现 ...

  3. world embedding 嵌入

    http://papers.nips.cc/paper/5477-neural-word-embedding-as-implicit-matrix-factorization 嵌入  |  Tenso ...

  4. office2013安装/激活

    ed2k://|file|cn_office_professional_plus_2013_x64_dvd_1134006.iso|914106368|E5FBAE9EE9CB35D5E777EA78 ...

  5. SDOI2017第一轮

    本蒟蒻表示终于$AC$了$SDOI2017\text{第一轮}$! 兴奋! 附上各个题的题解: $DAT1$: $T1$: BZOJ4816: [Sdoi2017]数字表格 $T2$: BZOJ481 ...

  6. Android中的资源访问

    Android中的资源是指非代码部分,指外部文件. assets中保存的一般是原生的文件,例如MP3文件,Android程序不能直接访问,必须通过AssetManager类以二进制流的形式来读取. r ...

  7. Intel Quick Sync Video Encoder 2

    这边博客主要记录在预研quick sync中涉及到的一些性能质量相关的关键参数设置. github: https://github.com/MarkRepo/qsve 1. VPP处理过程伪代码: M ...

  8. virt-v2v 使用指南

    virt-v2v 使用指南 1.定义. virt-v2v将外部的虚拟化平台上的虚拟机转化到可以运行的KVM平台上.它可以读取在VMware.Xen运行Hyper-V和其他虚拟机管理程序上的Window ...

  9. Data Structure Linked List: Flattening a Linked List

    http://www.geeksforgeeks.org/flattening-a-linked-list/ #include <iostream> #include <vector ...

  10. vRA7.x services do not register after a restart (2147446)

    After restarting the vRealize Automation Appliance, you experience these symptoms: In the vRealize A ...