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. div中嵌套div水平垂直居中

    div中嵌套一个居中的div有很多方法,如果不想调整边距,有一个简单的方法: <div align="center" style="width: 200px;hei ...

  2. java里的分支语句--程序运行流程的分类(顺序结构,分支结构,循环结构)

    JAVA里面的程序运行流程分三大类: 1,顺序结构:顺序结构就是依次执行每一行代码 2,分支结构:分支结构就是按不同的条件进行分支 3,循环结构:一段代码依条件进行循环执行. 其中,分支结构有两大类: ...

  3. [转]node.js学习笔记(二)

    二.express 1.安装 express4 npm --registry=http://registry.npmjs.org install -g express-generator (全局) 2 ...

  4. 那些年我们学过的PHP黑魔法

    那些年我们学过的PHP黑魔法 提交 我的评论 加载中 已评论 那些年我们学过的PHP黑魔法 2015-04-10 Sco4x0 红客联盟 红客联盟 红客联盟 微信号 cnhonker_huc 功能介绍 ...

  5. Frugalware Linux 1.9 RC1 发布

    Frugalware Linux 1.9 RC1 发布了,下载地址:fvbe-1.9rc1-full-x86_64.iso (1,874MB, SHA1). 发行通知:http://www.fruga ...

  6. TypeScript 0.9.1 发布,新增 typeof 关键字

    TypeScript 0.9.1 发布了,该版本提升了编译器和语言的性能,增加新的语言特性 typeof ,更好的 this 处理等.详细介绍请看发行说明. TypeScript 是微软新推出的一种语 ...

  7. 无环的visitor模式

    无环的访问者模式,是来改进原有访问者模式的不足之处的,是Robert C. Martin首次提出的.我们知道访问者模式的优点是为被访问继承体系动态添加行为,而无须改变继承体系.但是GOF访问者模式的缺 ...

  8. SharePoint 2013 REST 以及 OData 基础

    这篇文章会介绍: 简单的介绍REST,OData OData实现细节 OData在SharePoint 2013中的实现 为什么REST很重要 过去几年基于REST的webservice在IT企业越来 ...

  9. Redis教程(八):事务详解

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/135.html?1455806987 一.概述: 和众多其它数据库一样,R ...

  10. .net使用FluentValidation进行服务端验证。

          背景 最近使用asp.mvc 做一个在线口语系统项目,在服务端验证问题遇到了一些小问题. 自己根据数据库表user定义一个数据库表实体对象UserDbEntity [Table(" ...