http://www.lydsy.com/JudgeOnline/problem.php?id=2648

kdtree裸题。。。

抄板子一边抄对了。。。

挺好理解的,就是说我们先找出中间的元素,然后小的放左边,大的放右边,这样我们就确定了这个点,然后维度换一下,递归建树,很像splay,其实就是把平面每次一分为二,先横着再竖着。。。

然后那个get挺神奇的,大概就是估计一下现在这个点距离下一个区域的距离?其实就是优化枚举,减少了很多重复状态。。。

#include<bits/stdc++.h>
using namespace std;
const int N = , inf = << ;
struct data {
int l, r, d[], min[], max[];
} t[N];
int n, m, root, ans, d;
bool cp(data x, data y)
{
if(x.d[d] != y.d[d]) return x.d[d] < y.d[d];
return x.d[d ^ ] < y.d[d ^ ];
}
void update(int k)
{
for(int i = ; i < ; ++i)
{
if(t[k].l) t[k].min[i] = min(t[k].min[i], t[t[k].l].min[i]), t[k].max[i] = max(t[k].max[i], t[t[k].l].max[i]);
if(t[k].r) t[k].min[i] = min(t[k].min[i], t[t[k].r].min[i]), t[k].max[i] = max(t[k].max[i], t[t[k].r].max[i]);
}
}
int get(int k, data x)
{
int ret = ;
for(int i = ; i < ; ++i) ret += max(t[k].min[i] - x.d[i], ) + max(x.d[i] - t[k].max[i], );
return ret;
}
int build(int l, int r, int now)
{
d = now;
int mid = (l + r) >> ;
nth_element(t + l + , t + mid + , t + r + , cp);
for(int i = ; i < ; ++i) t[mid].min[i] = t[mid].max[i] = t[mid].d[i];
if(l < mid) t[mid].l = build(l, mid - , now ^ );
if(r > mid) t[mid].r = build(mid + , r, now ^ );
update(mid); return mid;
}
void insert(int k, int now, data x)
{
if(x.d[now] < t[k].d[now])
{
if(t[k].l) insert(t[k].l, now ^ , x);
else
{
t[k].l = ++n;
for(int i = ; i < ; ++i) t[n].max[i] = t[n].min[i] = t[n].d[i] = x.d[i];
}
}
else
{
if(t[k].r) insert(t[k].r, now ^ , x);
else
{
t[k].r = ++n;
for(int i = ; i < ; ++i) t[n].max[i] = t[n].min[i] = t[n].d[i] = x.d[i];
}
}
update(k);
}
void query(int k, int now, data x)
{
int d = abs(t[k].d[] - x.d[]) + abs(t[k].d[] - x.d[]), dl = inf, dr = inf;
ans = min(ans, d);
if(t[k].l) dl = get(t[k].l, x);
if(t[k].r) dr = get(t[k].r, x);
if(dl < dr)
{
if(dl < ans) query(t[k].l, now ^ , x);
if(dr < ans) query(t[k].r, now ^ , x);
}
else
{
if(dr < ans) query(t[k].r, now ^ , x);
if(dl < ans) query(t[k].l, now ^ , x);
}
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i <= n; ++i) scanf("%d%d", &t[i].d[], &t[i].d[]);
root = build(, n, );
while(m--)
{
int opt; data x; scanf("%d%d%d", &opt, &x.d[], &x.d[]);
if(opt == ) insert(root, , x);
if(opt == )
{
ans = inf;
query(root, , x);
printf("%d\n", ans);
}
}
return ;
}

bzoj2648的更多相关文章

  1. 【bzoj2648】 SJY摆棋子

    http://www.lydsy.com/JudgeOnline/problem.php?id=2648 (题目链接) 题意 动态维护二维平面上的点的插入以及最邻近域搜索. Solution KDtr ...

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

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

  3. 【BZOJ2648】SJY摆棋子(KD-Tree)

    [BZOJ2648]SJY摆棋子(KD-Tree) 题面 BZOJ Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一 ...

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

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

  5. 【BZOJ2648】SJY摆棋子 KDtree

    [BZOJ2648]SJY摆棋子 Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找 ...

  6. KD-Tree复习笔记(BZOJ1941 & BZOJ2648 & BZOJ4066)

    快一年了都没碰到什么必须用KDT的题目导致模板完全忘光了,重新复习了一下. K_Dimention_Tree是一种用来处理二维以上问题的数据结构(OI中一般都是二维),本质是二维启发式估价函数实现剪枝 ...

  7. [bzoj2648/2716]SJY摆棋子_KD-Tree

    SJY摆旗子 bzoj-2648 题目大意:平面上有n个黑子.有m个操作,可以下一颗白子,查询与曼哈顿距离下最近黑子之间的曼哈顿距离,或者下一颗黑子. 注释:$1\le n,m\le 5\cdot 1 ...

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

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

  9. Bzoj2648 SJY摆棋子

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

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

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

随机推荐

  1. if语句,while语句,do whlie语句,循环语句

    总结: 1.定义数组并赋值: var arr=[1,2,3,4]; 2.通过下标访问数组: var str=arr[0]; 3.自定义数组 var arr=new Array(); 4.数组的赋值 a ...

  2. pycharm中将ui文件转换成py文件

    方法一:直接使用命令行 python -m PyQt5.uic.pyuic xx.ui -o xx.py 方法二:直接使用命令 先进到C:\python\pkgs\pyqt-5.9.2-py37h65 ...

  3. Java真实笔试题一

    PS:昨天去笔试后,发现自己对于JavaSE的基础部分还是有些薄弱的地方,特将昨天自己不是太清楚的地方记录下来,巩固基础. 子类继承父类静态方法的问题 public class Study { pub ...

  4. Bookshelf 2(poj3628,01背包,dp递推)

    题目链接:Bookshelf 2(点击进入) 题目解读: 给n头牛,给出每个牛的高度h[i],给出一个书架的高度b(所有牛的高度相加>书架高度b),现在把一些牛叠起来(每头牛只能用一次,但不同的 ...

  5. eshing wind/tidal turbine using Turbogrid

    Table of Contents 1. meshing wind turbine using Turbogrid 1.1. ref 1 meshing wind turbine using Turb ...

  6. NT9666X调试log

    1.给GSensor_open();前加上打印函数DEBUG_P;打印如下信息: ######## FILE = e:/Project_code/Philips_PanGu/Philips_PanGu ...

  7. 51nod1429 巧克力

    [题解] 找一下两个面积s1,s2的2和3的因子数,把他们除掉,如果s1,s2不相等,就是-1,否则可以用s1,s2的2和3的因子数计算答案. #include<cstdio> #incl ...

  8. saltstack(四) saltstack的targeting、分组

    targeting支持如下matcher: Globing : '*', 正则: 指定-E参数,正则表达式匹配多个 List: 指定-L参数,salt -E 'web1-(prod|devel)' t ...

  9. redis学习——数据类型

    一.内容简介 Redis不仅仅是简单的key-value 存储器,同时也是一种data structures server.传统的key-value是指支持使用一个key字符串来索引value字符串的 ...

  10. Maven学习总结(32)——Maven项目部署到Tomcat8中

    1.环境准备 Maven.Tomcat8.Eclipse 2.maven中的镜像配置 大家知道,mavne默认使用的是国外的镜像,但是速度很慢,这里建议大家使用阿里的中央仓库镜像. 阿里出品,必出精品 ...