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 ...
随机推荐
- Luogu P3797 妖梦斩木棒
解题思路 用线段树做这个就不用说了吧,但是要维护的东西确实很神奇.在每一个节点上都维护一个$lbkt$,表示这个区间上最靠左的右括号的位置:一个$rbkt$,表示这个区间上最靠右的左括号的位置.还有一 ...
- linux网络编程——域名转换 gethostbyname与gethostbyaddr
域名转换 #include <netdb.h> struct hostent *gethostbyname(const char *name); 参数: name: 执行主机名的指针 返回 ...
- [USACO15JAN]Grass Cownoisseur
\(tarjan\)缩点+\(DAG\)上最长路. 求一个以\(1\)为起点的最长路和一个以\(1\)为终点的最长路,然后找那个逆行边就行了. 然后这个我\(RE\)了好久,原因是\(vector\) ...
- SVN A C D M G U R I 的含义
A:add,新增 C:conflict,冲突 D:delete,删除 M:modify,本地已经修改 G:modify and merGed,本地文件修改并且和服务器的进行合并 U:update,从服 ...
- JMeter测试websocket
今天公司要测websocket,搞了一天踩了不少坑,关键是还没爬出来,BOSS让回家再理理思路,没办法到家就开干. 一.家里玩的还是2.1的,为了少踩坑,先下个JMeter5.1.1(他们说4版本也行 ...
- 【Codeforces 522B】Photo to Remember
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 模拟题.用set模拟下就好 [代码] import java.io.*; import java.util.*; public class M ...
- 【Codeforces 372A】Counting Kangaroos is Fun
[链接] 我是链接,点我呀:) [题意] 如果a[i]*2<=a[j]那么i袋鼠可以装进j袋鼠里面 每只袋鼠都只能装一只袋鼠 [题解] 假设最后的方案是(ai,bi) 这里(ai,bi)表示下标 ...
- java json数据转List对象的集合-----阿里巴巴插件---及原生json---JSON 与 对象 、集合 之间的转换 JSON字符串和java对象的互转【json-lib】
List<RunfastFullLess> list=(List<RunfastFullLess>)JSONArray.parseObject(activity.getFull ...
- BNUOJ 33898 Cannon
Cannon Time Limit: 1000ms Memory Limit: 65535KB This problem will be judged on HDU. Original ID: 449 ...
- [bzoj 1047][HAOI2007]理想正方形(单调队列)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 分析: 第一感觉二维线段树当然没问题但是挺慢的. 注意到要求的正方形形中的最大最小边长是 ...