2648: SJY摆棋子

题目连接:

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

Description

这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子。此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) 。现在给出N<=500000个初始棋子。和M<=500000个操作。对于每个白色棋子,输出距离这个白色棋子最近的黑色棋子的距离。同一个格子可能有多个棋子。

Input

第一行两个数 N M

以后M行,每行3个数 t x y

如果t=1 那么放下一个黑色棋子

如果t=2 那么放下一个白色棋子

Output

对于每个T=2 输出一个最小距离

Sample Input

2 3

1 1

2 3

2 1 2

1 3 3

2 4 2

Sample Output

1

2

Hint

题意

题解:

kdtree裸题

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000005;
#define INF 1000000000
struct arr{
int d[2],min[2],max[2],l,r;
};
int D,root,x,y,ans,n,m,tot,op;;
inline int cmp(arr a,arr b)
{
return a.d[D]<b.d[D]||a.d[D]==b.d[D]&&a.d[D^1]<b.d[D^1];
}
arr a[maxn]; inline void up(int k,int s)
{
a[k].min[0]=min(a[k].min[0],a[s].min[0]);
a[k].max[0]=max(a[k].max[0],a[s].max[0]);
a[k].min[1]=min(a[k].min[1],a[s].min[1]);
a[k].max[1]=max(a[k].max[1],a[s].max[1]);
}
int build(int l,int r,int dd)
{
D=dd;int mid=(l+r)>>1;
nth_element(a+l+1,a+mid+1,a+r+1,cmp);
a[mid].min[0]=a[mid].max[0]=a[mid].d[0];
a[mid].min[1]=a[mid].max[1]=a[mid].d[1];
if (l!=mid) a[mid].l=build(l,mid-1,dd^1);
if (mid!=r) a[mid].r=build(mid+1,r,dd^1);
if (a[mid].l) up(mid,a[mid].l);
if (a[mid].r) up(mid,a[mid].r);
return mid;
}
void insert(int k)
{
int p=root;D=0;
while (1)
{
up(p,k);
if (a[k].d[D]<=a[p].d[D]){if (!a[p].l) {a[p].l=k;return;} p=a[p].l;}
else {if (!a[p].r) {a[p].r=k;return;} p=a[p].r;}
D^=1;
}
}
int getdis(int k)
{
int res=0;
if (x<a[k].min[0]) res+=a[k].min[0]-x;
if (x>a[k].max[0]) res+=x-a[k].max[0];
if (y<a[k].min[1]) res+=a[k].min[1]-y;
if (y>a[k].max[1]) res+=y-a[k].max[1];
return res;
}
void ask(int k)
{
int d0=abs(a[k].d[0]-x)+abs(a[k].d[1]-y);
if (d0<ans) ans=d0;
int dl=(a[k].l)?getdis(a[k].l):INF;
int dr=(a[k].r)?getdis(a[k].r):INF;
if (dl<dr){if (dl<ans) ask(a[k].l);if (dr<ans) ask(a[k].r);}
else {if (dr<ans) ask(a[k].r);if (dl<ans) ask(a[k].l);}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].d[0],&a[i].d[1]);
}
if(n)root = build(1,n,0);
for(int i=1;i<=m;i++){
scanf("%d",&op);
if(op==1){
n++;
scanf("%d%d",&a[n].d[0],&a[n].d[1]);
a[n].min[0]=a[n].max[0]=a[n].d[0];
a[n].min[1]=a[n].max[1]=a[n].d[1];
insert(n);
}else if(op==2){
ans=2000000000;
scanf("%d%d",&x,&y);
ask(root);
printf("%d\n",ans);
}
}
}

BZOJ 2648: SJY摆棋子 kdtree的更多相关文章

  1. bzoj 2648 SJY摆棋子——KDtree

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648 第一道KDtree! 学习资料:https://blog.csdn.net/zhl30 ...

  2. BZOJ 2648 SJY摆棋子 ——KD-Tree

    [题目分析] KD-Tree第一题,其实大概就是搜索剪枝的思想,在随机数据下可以表现的非常好NlogN,但是特殊数据下会达到N^2. 精髓就在于估价函数get以及按照不同维度顺序划分的思想. [代码] ...

  3. bzoj 2648: SJY摆棋子 KDtree + 替罪羊式重构

    KDtree真的很妙啊,真的是又好写,作用还多,以后还需更多学习呀. 对于这道题,我们求的是曼哈顿距离的最小值. 而维护的变量和以往是相同的,就是横纵坐标的最小值与最大值. 我们设为一个极为巧妙且玄学 ...

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

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

  5. BZOJ 2648: SJY摆棋子

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

  6. bzoj 2648: SJY摆棋子【KD-tree】

    其实理论上cdq更优 核心是依次取x值.y值的mid作为当前节点,向两边递归建立二叉树,树上维护size:子树大小:mx[0/1]:子树内最大x/y:mn[0/1]:子树内最小x/y:d[0/1]:这 ...

  7. BZOJ 2648: SJY摆棋子(K-D Tree)

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 6051  Solved: 2113[Submit][Status][Discuss] Descript ...

  8. bzoj 2648 SJY摆棋子 kd树

    题目链接 初始的时候有一些棋子, 然后给两种操作, 一种是往上面放棋子. 另一种是给出一个棋子的位置, 问你离它最近的棋子的曼哈顿距离是多少. 写了指针版本的kd树, 感觉这个版本很好理解. #inc ...

  9. BZOJ 2648 SJY摆棋子(KD Tree)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2648 题意: 思路: KDtree模板题. 参考自http://www.cnblogs.com/ra ...

随机推荐

  1. andorid lint

    (一)Lint简介 Android SDK提供了一个代码扫描工具,称为lint.可以帮助您轻松地识别并纠正问题与结构质量的代码,不必执行应用程序或编写任何测试用例.每个问题检测到该工具报告的一个描述消 ...

  2. Java 第五章 循环结构1

    循环结构 1 while 循环结构 ,do- while 循环结构 . 循环结构: 必须满足两个条件 . 1,循环条件 和 循环 操作 ! while 循环 特点:先判断,再执行 , 编码规范:缩进, ...

  3. php笔试题(3)--转载

    1.nginx使用哪种网络协议? nginx是应用层 我觉得从下往上的话 传输层用的是tcp/ip 应用层用的是http fastcgi负责调度进程 2. <? echo 'hello tush ...

  4. OkHttp使用介绍

    版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/4001708.html 为什么需要一个HTTP库 Androi ...

  5. Salesforce 生成测试可用 Id

    在写 Test Class 的时候,有时候需要一批有 Id 的数据或者把 Id 作为参数等情况,在数据关系比较复杂的情况下去造真实数据有些麻烦,于是找到这样一个可以生成 Id 的方法可以用来辅助测试! ...

  6. [ACM_几何] UVA 11300 Spreading the Wealth [分金币 左右给 最终相等 方程组 中位数]

    Problem A Communist regime is trying to redistribute wealth in a village. They have have decided to ...

  7. [WinAPI] API 8 [获取磁盘空间信息]

    获取磁盘分区的总容量和空闲空间的容量可以使用GetDiskFreeSpace函数或GetDiskFree SpaceEx函数.GetDiskFreeSpace使用DWORD类型作为输出参数,由于DWO ...

  8. 一个格式化日期和时间的JavaScript类库

    原文地址:http://www.cnblogs.com/zhangpengshou/archive/2012/07/19/2599053.html 结合meizz的代码做了适当调整. Date.pro ...

  9. 错误The request sent by the client was syntactically incorrect ()的解决

    http://www.cnblogs.com/xiandedanteng/p/4168609.html 这个错误是SpringMVC报出来的,见到它意味着html/jsp页面的控件名称 和 contr ...

  10. 在Html中使用Requirejs进行模块化开发

    在前端模块化的时候,不仅仅是js需要进行模块化管理,html有时候也需要模块化管理.这里就介绍下如何通过requirejs,实现html代码的模块化开发. 如何使用requirejs加载html Re ...