解题关键:带插入kdtree模板题。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1000005
#define inf (1<<30)
using namespace std;
int n,m,dim,rt,ans;
struct node{int p[],x[],y[];}a[N];
bool cmp(node x,node y){ return x.p[dim]<y.p[dim]; }
struct kd_tree{
int c[N][];
node s[N],q;
void update(int k){//管辖范围
int l=c[k][],r=c[k][];
for(int i=;i<;i++){
if(l){ s[k].x[i]=min(s[k].x[i],s[l].x[i]); s[k].y[i]=max(s[k].y[i],s[l].y[i]); }
if(r){ s[k].x[i]=min(s[k].x[i],s[r].x[i]); s[k].y[i]=max(s[k].y[i],s[r].y[i]); }
}
}
void add(int k,node t){ for(int i=;i<;i++)s[k].x[i]=s[k].y[i]=s[k].p[i]=t.p[i]; }
int dist(node t,int k){
int tmp=;
for(int i=;i<;i++) tmp+=max(,s[k].x[i]-t.p[i]);
for(int i=;i<;i++) tmp+=max(,t.p[i]-s[k].y[i]);
return tmp;
}//?
void build(int &k,int l,int r,int now){
k=(l+r)>>; dim=now;
nth_element(a+l,a+k,a+r+,cmp);
add(k,a[k]);
if(l<k) build(c[k][],l,k-,now^);
if(k<r) build(c[k][],k+,r,now^);
update(k);
} void ins(int k,int now){
if(q.p[now]<s[k].p[now]){
if(c[k][]) ins(c[k][],now^);
else c[k][]=++n,add(n,q);
}
else{
if(c[k][]) ins(c[k][],now^);
else c[k][]=++n,add(n,q);
}
update(k);
}
void qry(int k){//曼哈顿距离,且只求最短,dis是最短距离
int tmp=;
for(int i=;i<;i++) tmp+=abs(s[k].p[i]-q.p[i]);
ans=min(ans,tmp);
int dl=c[k][]?dist(q,c[k][]):inf,dr=c[k][]?dist(q,c[k][]):inf;
if(dl<dr){
if(dl<ans) qry(c[k][]);
if(dr<ans) qry(c[k][]);
}else{
if(dr<ans) qry(c[k][]);
if(dl<ans) qry(c[k][]);
}
}
}kd; int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d%d",&a[i].p[],&a[i].p[]);
kd.build(rt,,n,);
while(m--){
int k;
scanf("%d%d%d",&k,&kd.q.p[],&kd.q.p[]);
if(k==) kd.ins(rt,);
else{
ans=inf; kd.qry(rt); printf("%d\n",ans);
}
}
return ;
}

2、将2维普遍化。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1000005
#define inf (1<<30)
using namespace std;
int n,m,dim,rt,ans,k;
struct node{int p[],minn[],maxx[];}a[N];
bool cmp(node x,node y){ return x.p[dim]<y.p[dim]; }
struct kd_tree{
int c[N][];
node s[N],q;
void update(int o){//管辖范围
int l=c[o][],r=c[o][];
for(int i=;i<k;i++){
if(l){ s[o].minn[i]=min(s[o].minn[i],s[l].minn[i]); s[o].maxx[i]=max(s[o].maxx[i],s[l].maxx[i]); }
if(r){ s[o].minn[i]=min(s[o].minn[i],s[r].minn[i]); s[o].maxx[i]=max(s[o].maxx[i],s[r].maxx[i]); }
}
}
void add(int o,node t){ for(int i=;i<k;i++)s[o].minn[i]=s[o].maxx[i]=s[o].p[i]=t.p[i]; }
int dist(node t,int o){
int tmp=;
for(int i=;i<k;i++) tmp+=max(,s[o].minn[i]-t.p[i]);
for(int i=;i<k;i++) tmp+=max(,t.p[i]-s[o].maxx[i]);
return tmp;
}//?
void build(int &o,int l,int r,int now){
o=(l+r)>>; dim=now%k;
nth_element(a+l,a+o,a+r+,cmp);
add(o,a[o]);
if(l<o) build(c[o][],l,o-,now+);
if(o<r) build(c[o][],o+,r,now+);
update(o);
} void ins(int o,int now){
now%=k;
if(q.p[now]<s[o].p[now]){
if(c[o][]) ins(c[o][],now+);
else c[o][]=++n,add(n,q);
}
else{
if(c[o][]) ins(c[o][],now+);
else c[o][]=++n,add(n,q);
}
update(o);
}
void qry(int o){//曼哈顿距离,且只求最短,dis是最短距离
int tmp=;
for(int i=;i<k;i++) tmp+=abs(s[o].p[i]-q.p[i]);
ans=min(ans,tmp);
int dl=c[o][]?dist(q,c[o][]):inf,dr=c[o][]?dist(q,c[o][]):inf;
if(dl<dr){
if(dl<ans) qry(c[o][]);
if(dr<ans) qry(c[o][]);
}else{
if(dr<ans) qry(c[o][]);
if(dl<ans) qry(c[o][]);
}
}
}kd; int main(){
k=;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d%d",&a[i].p[],&a[i].p[]);
kd.build(rt,,n,);
while(m--){
int k;
scanf("%d%d%d",&k,&kd.q.p[],&kd.q.p[]);
if(k==) kd.ins(rt,);
else{
ans=inf; kd.qry(rt); printf("%d\n",ans);
}
}
return ;
}

[bzoj2648]SJY摆棋子(带插入kd-tree)的更多相关文章

  1. 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2459  Solved: 834[Submit][Status][Discu ...

  2. BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶

    BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...

  3. [BZOJ2648] SJY摆棋子 kd-tree

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

  4. luogu4169 [Violet]天使玩偶/SJY摆棋子 / bzoj2648 SJY摆棋子 k-d tree

    k-d tree + 重构的思想,就能卡过luogu和bzoj啦orz #include <algorithm> #include <iostream> #include &l ...

  5. Bzoj2648 SJY摆棋子

    Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 3128  Solved: 1067 Description 这天,SJY显得无聊.在家自己玩.在一个 ...

  6. 2019.01.14 bzoj2648: SJY摆棋子(kd-tree)

    传送门 kd−treekd-treekd−tree模板题. 题意简述:支持在平面上插入一个点,求对于一个点的最近点对. 思路:cdqcdqcdq是一种很不错的分治方法 只是好像码量有点窒息 所以我用了 ...

  7. BZOJ2648 SJY摆棋子(KD-Tree)

    板子题. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

  8. 【kd-tree】bzoj2648 SJY摆棋子

    #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...

  9. KDTree(Bzoj2648: SJY摆棋子)

    题面 传送门 KDTree 大概就是一个分割\(k\)维空间的数据结构,二叉树 建立:每层选取一维为关键字,把中间的点拿出来,递归左右,有个\(STL\)函数nth_element可以用一下 维护:维 ...

随机推荐

  1. WPF绘制简单常用的Path(转)

    写代码出身的我们经常需要使用一些简单 但是不是规则图形的Path 但限于美工功底有限 不知道怎么去画 下面我告诉大家一些简单的小技巧 用代码来画Path 个人还是比较喜欢用代码 因为数值控制的更精细 ...

  2. uva 11237 - Halloween treats(抽屉原理)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011328934/article/details/37612503 题目链接:uva 11237 ...

  3. Nunit中如何进行事务性单元测试

    单元测试要求:单元测试方法并不真正去变更数据库,也就是说单元测试不依赖于数据库中的数据.那我们如何解决执行单元测试方法后,不变更数据库中数据呢? 一般的解决方案有两种: 1. 新建一个单元测试数据库, ...

  4. ecmall类关系图(转)

  5. Unit03: 容器对路径的处理 、 Servlet特性

    Unit03: 容器对路径的处理 . Servlet特性 案例一:查询,增加员工: 重定向 处理请求资源路径 目录结构: 案例代码: package dao; import java.io.Seria ...

  6. STM32之中断

    在STM32(Cortex-M3)中没有显示的代码拷贝,只有启动代码进行了向量的初始化,一直以为是编译器在程序影像中自己完成了相关向量的拷贝,即,拷贝到固定的NVIC区,事实上并不是这样,cortex ...

  7. mybatis实现继承映射

    ORM 框架的优势在于能让我们利用面向对象的思维去操作数据库, hibernate 作为重量级的 ORM 框架对面向对象的支持很强大.作为半自动化的 mybatis ,对面向对象的支持也是很完备的.这 ...

  8. 为什么要用webUI?

    先看看身边有哪些软件已经在用webUI: 1.QQ查找窗口: 2.LOL主界面: 3.EC营销软件功能界面: 三个例子足以说明一切: 1.HTML是目前在用户体验.界面舒适度最先进的语言 2.HTML ...

  9. python 之 functools模块

    functools模块用于高阶函数:作用于或返回其他函数的函数.一般而言,任何可调用对象都可以作为本模块用途的函数来处理. 官方文档已经有了详尽的介绍,这里就不在复述,详情请见:官方文档 .这里主要介 ...

  10. 【Java】编程

    3.Java I/O流输入输出,序列化,NIO,NIO.2 https://www.cnblogs.com/jiangwz/p/9193776.html 4.JAVA调用WCF(转) https:// ...