bzoj2648
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的更多相关文章
- 【bzoj2648】 SJY摆棋子
http://www.lydsy.com/JudgeOnline/problem.php?id=2648 (题目链接) 题意 动态维护二维平面上的点的插入以及最邻近域搜索. Solution KDtr ...
- BZOJ2648 SJY摆棋子(KD-Tree)
板子题. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- 【BZOJ2648】SJY摆棋子(KD-Tree)
[BZOJ2648]SJY摆棋子(KD-Tree) 题面 BZOJ Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一 ...
- BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶
BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...
- 【BZOJ2648】SJY摆棋子 KDtree
[BZOJ2648]SJY摆棋子 Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找 ...
- KD-Tree复习笔记(BZOJ1941 & BZOJ2648 & BZOJ4066)
快一年了都没碰到什么必须用KDT的题目导致模板完全忘光了,重新复习了一下. K_Dimention_Tree是一种用来处理二维以上问题的数据结构(OI中一般都是二维),本质是二维启发式估价函数实现剪枝 ...
- [bzoj2648/2716]SJY摆棋子_KD-Tree
SJY摆旗子 bzoj-2648 题目大意:平面上有n个黑子.有m个操作,可以下一颗白子,查询与曼哈顿距离下最近黑子之间的曼哈顿距离,或者下一颗黑子. 注释:$1\le n,m\le 5\cdot 1 ...
- 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2459 Solved: 834[Submit][Status][Discu ...
- Bzoj2648 SJY摆棋子
Time Limit: 20 Sec Memory Limit: 128 MB Submit: 3128 Solved: 1067 Description 这天,SJY显得无聊.在家自己玩.在一个 ...
- 【kd-tree】bzoj2648 SJY摆棋子
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...
随机推荐
- 09Microsoft SQL Server 表数据插入,更新,删除
Microsoft SQL Server 表数据插入,更新,删除 向表中插入数据 INSERT INTO insert into tb1 values(0004,'张凤凤') insert into ...
- PHP 加密:Password Hashing API
PHP 5.5 之后引入 Password hashing API 用于创建和校验哈希密码,它属于内核自带,无需进行任何扩展安装和配置.它主要提供了四个函数以供使用: password_hash(): ...
- 「 CODE[VS] P2853 」 方格游戏
题目大意 给定一张 $n\times n$ 的网格.每个格子上都有一个系数 $a$,先下 $A$ 和 $B$ 两人选择两条 $(1,1)\rightarrow (n,n)$ 路径.要求着两条路径不能相 ...
- 解决window.location.href参数太长
前言:一提到页面跳转,最常用的一般就是window.location.href,如果需要带参数,也许可以在后面用?拼上,但这样并不安全,而且有个更严重的问题,这样的拼接是有长度限制的,如果达到好几千个 ...
- 2.js原型的基本概念
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [bzoj2461][BeiJing2011][符环] (括号配对+记忆化搜索+高维dp)
Description 在可以炼制魔力强大的法杖的同时,Magic Land 上的人们渐渐意识到,魔力强大并不一定能给人们带来好处——反而,由此产生的破坏性的高魔力释放,给整个大陆蒙上了恐怖的阴影. ...
- 3.5.6 关系和boolean运算符
Java包含丰富的关系运算符.要检测相等性,可以使用两个等号 == .例如, 3 == 7 的值为 false. 另外可以使用 != 检测不相等.例如, 3 ! = 7 的值 ...
- Spring核心技术(二)——Spring的依赖及其注入
本文将继续前文,描述Spring IoC中的依赖处理. 依赖 一般情况下企业应用不会只有一个对象(或者是Spring Bean).甚至最简单的应用都要多个对象来协同工作来让终端用户看到一个完整的应用的 ...
- Netty学习总结(4)——图解Netty之Pipeline、channel、Context之间的数据流向
以下所绘制图形均基于Netty4.0.28版本. 一.connect(outbound类型事件) 当用户调用channel的connect时,会发起一个outbound类型的事件,该事件将在pipel ...
- [luoguP2038] 无线网络发射器选址(模拟)
传送门 又是个模拟水题,考虑边界就好,连long long都不用开. ——代码 #include <cstdio> #include <iostream> int n, d, ...