题目描述

Ayu在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下。而七年后 的今天,Ayu却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它。

我们把Ayu生活的小镇看作一个二维平面坐标系,而Ayu会不定时地记起可能在某个点 (xmy) 埋下了天使玩偶;或者Ayu会询问你,假如她在 (x,y) ,那么她离近的天使玩偶可能埋下的地方有多远。

因为Ayu只会沿着平行坐标轴的方向来行动,所以在这个问题里我们定义两个点之间的距离为dist(A,B)=|Ax-Bx|+|Ay-By|。其中Ax表示点A的横坐标,其余类似。

输入输出格式

输入格式:
第一行包含两个整数n和m ,在刚开始时,Ayu已经知道有n个点可能埋着天使玩偶, 接下来Ayu要进行m次操作
接下来n行,每行两个非负整数 (xi,yi),表示初始n个点的坐标。
再接下来m 行,每行三个非负整数t,xi,yi。
如果t=1,则表示Ayu又回忆起了一个可能埋着玩偶的点 (xi,yi) 。
如果t=2,则表示Ayu询问如果她在点 (xi,yi) ,那么在已经回忆出来的点里,离她近的那个点有多远。

输出格式:
对于每个t=2的询问,在单独的一行内输出该询问的结果。

输入输出样例

输入样例#1:
2 3
1 1
2 3
2 1 2
1 3 3
2 4 2

输出样例#1:
1
2

说明

n,m<=300000
xi,yi<=1000000


分析:
一眼KDtree裸题
详解请移步—>
这道题用KDtree是可以分分钟秒掉的,但是传说中还有一种CDQ分治解法
具体会在另一篇blog中讲解

tip

KDtree的是空间复杂度:N(实质上就是一种二叉树),注意这里要加上之后添加的结点
KDtree中的x,y一定是全局变量

dis函数要留心

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;const int INF=0x33333333;
const int N=300010;
int root,n,m,x,y,opt,cmpd,ans;
struct node{int d[2],mn[2],mx[2],lc,rc;
};
node t[N<<1];bool cmp(const node &a,const node &b)
{if (a.d[cmpd]!=b.d[cmpd]) return a.d[cmpd]<b.d[cmpd];else return a.d[!cmpd]<b.d[!cmpd];
}void update(int bh)     //维护当前结点所控制的区间大小
{int lc=t[bh].lc;int rc=t[bh].rc;if (lc){t[bh].mn[0]=min(t[bh].mn[0],t[lc].mn[0]);t[bh].mn[1]=min(t[bh].mn[1],t[lc].mn[1]);t[bh].mx[0]=max(t[bh].mx[0],t[lc].mx[0]);t[bh].mx[1]=max(t[bh].mx[1],t[lc].mx[1]);}if (rc){t[bh].mn[0]=min(t[bh].mn[0],t[rc].mn[0]);t[bh].mn[1]=min(t[bh].mn[1],t[rc].mn[1]);t[bh].mx[0]=max(t[bh].mx[0],t[rc].mx[0]);t[bh].mx[1]=max(t[bh].mx[1],t[rc].mx[1]);}
}int build(int l,int r,int D)
{cmpd=D;int mid=(l+r)>>1;nth_element(t+l,t+mid+1,t+r+1,cmp);t[mid].mn[0]=t[mid].mx[0]=t[mid].d[0];t[mid].mn[1]=t[mid].mx[1]=t[mid].d[1];if (mid!=l) t[mid].lc=build(l,mid-1,!D);if (mid!=r) t[mid].rc=build(mid+1,r,!D);update(mid);return mid;       //不用忘了返回值
}void insert(int p)
{int D,now;D=0; now=root;while (1){if (t[p].mn[0]<t[now].mn[0]) t[now].mn[0]=t[p].mn[0];   //按照插入结点修改维护范围 if (t[p].mn[1]<t[now].mn[1]) t[now].mn[1]=t[p].mn[1];if (t[p].mx[0]>t[now].mx[0]) t[now].mx[0]=t[p].mx[0];if (t[p].mx[1]>t[now].mx[1]) t[now].mx[1]=t[p].mx[1];if (t[p].d[D]>=t[now].d[D]){if (!t[now].rc){t[now].rc=p;return;}else now=t[now].rc;}else{if (!t[now].lc){t[now].lc=p;return;}else now=t[now].lc;}D=!D;}
}int dis(int p,int x,int y)
{int d=0;if (x<t[p].mn[0]) d+=(t[p].mn[0]-x);if (x>t[p].mx[0]) d+=(x-t[p].mx[0]);if (y<t[p].mn[1]) d+=(t[p].mn[1]-y);if (y>t[p].mx[1]) d+=(y-t[p].mx[1]);return d;
}void ask(int now)
{int dl,dr,d0;d0=abs(t[now].d[0]-x)+abs(t[now].d[1]-y);if (d0<ans) ans=d0;if (t[now].lc) dl=dis(t[now].lc,x,y);else dl=INF;if (t[now].rc) dr=dis(t[now].rc,x,y);else dr=INF;if (dl<dr){if (dl<ans) ask(t[now].lc);     //距离近的先递归 if (dr<ans) ask(t[now].rc);}else{if (dr<ans) ask(t[now].rc);if (dl<ans) ask(t[now].lc);}
}int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)scanf("%d%d",&t[i].d[0],&t[i].d[1]);root=build(1,n,0);int opt;for (int i=1;i<=m;i++){scanf("%d%d%d",&opt,&x,&y);if (opt==1){n++;t[n].d[0]=t[n].mn[0]=t[n].mx[0]=x;t[n].d[1]=t[n].mn[1]=t[n].mx[1]=y;insert(n);}else {ans=INF;ask(root);printf("%d\n",ans);}}return 0;
}

bzoj2716 [Violet 3]天使玩偶(KDtree)相关推荐

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

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

  2. bzoj2716 [Violet 3]天使玩偶

    2716: [Violet 3]天使玩偶 Time Limit: 80 Sec  Memory Limit: 128 MB Submit: 2160  Solved: 936 [Submit][Sta ...

  3. [KDTree] [BZOJ2716] [Violet 3] 天使玩偶

    题目描述 Description Ayu在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后的今天,Ayu却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们 ...

  4. bzoj2716 [Violet 3]天使玩偶(CDQ分治)

    前言:我们又回到了这道题,不过这次我们选择一个常数小一点的算法:CDQ Description Input Output Sample Input 100 100 81 23 27 16 52 58 ...

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

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

  6. 【BZOJ 2716/2648】 [Violet 3]天使玩偶

    2716: [Violet 3]天使玩偶 kd-tree模板题. ①首先依次按照每一维(即先按照 x x,再按照yy,再按照 x x-多维同理)将点存在一棵二叉树中: 先求出以当前维数为关键字的中间点 ...

  7. BZOJ 2716 Violet 3 天使玩偶

    2716: [Violet 3]天使玩偶 Time Limit: 80 Sec  Memory Limit: 128 MB Submit: 2145  Solved: 928 [Submit][Sta ...

  8. BZOJ 2716: [Violet 3]天使玩偶

    2716: [Violet 3]天使玩偶 Time Limit: 80 Sec  Memory Limit: 128 MB Submit: 1473  Solved: 621 [Submit][Sta ...

  9. [BZOJ2716/2648][Violet 3]天使玩偶/SJY摆棋子[KDtree]

    KDtree干这个复杂度是不对的,重构不一定有作用 解释一下的话,因为复杂度是跟size相关的,所以重构作用不大,KDtree在查询最近点对中的作用仅仅是剪枝,可以构造数据使得他遍历O(n)个节点 h ...

最新文章

  1. [Step By Step]SAP HANA中使用Excel展示分析视图数据(带层次结构)
  2. Centos7静态ip设置(亲测有效)
  3. (十五)nodejs循序渐进-高性能游戏服务器框架pomelo之Protobuf模块
  4. 庆五一,We7同步发行2.5正式版、2.6 Beta版!
  5. 软件工程java向量相似度计算_向量的相似度计算常用方法9个
  6. [转载][工具]Eclipse Console 加大显示的行数,禁止弹出
  7. Apple, Samsung, and Nokia
  8. Can't use Subversion command line client: svn Probably the path to Subversion executable is wrong
  9. 教师国培计算机计划,教师国培计划大全
  10. Apple Pay的使用
  11. XShell「6.0.0111」已激活授权绿色版v2
  12. 汇编语言基础:寄存器和寻址方式
  13. 【转】京东商城思维导图
  14. LAMP 技术简介(1)
  15. access计算机二级大纲,计算机二级Access考试内容大纲
  16. 穿山甲插屏广告居中_自渲染插屏
  17. 云计算技术及其应用前景分析
  18. sonique的插件Dee2
  19. mysql无密码登录
  20. 第十周 吉林市一日游

热门文章

  1. 介绍计算机发明英语作文带翻译,一篇关于发明的英语作文带翻译
  2. 华为全面屏鸿蒙,华为鸿蒙OS强势来袭:全面屏+麒麟985+12GB
  3. 【黑苹果】华硕ROG玩家国度 M11H Z390 i9 9900k macOS10.14.4 efi文件下载
  4. 黑盒测试c语言用例,黑盒测试用例设计技术包括_测试用例包括什么_常用黑盒测试用例设计(4)...
  5. 行书基本笔画连笔书写十八法
  6. 数组——排序(起泡法)
  7. mysql被木马入侵_另类网站入侵之一句话木马图片的妙用
  8. 用于数据保护的5款Linux加密工具
  9. 创新奇智完成逾4亿元A和A+轮融资,未来持续专注B端市场...
  10. arduino的servo函数_如何使用Arduino舵机库servo.h – 八色木