2648: SJY摆棋子

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 2459  Solved: 834
[Submit][Status][Discuss]

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可以过

Source

鸣谢 孙嘉裕

2716: [Violet 3]天使玩偶

Time Limit: 80 Sec  Memory Limit: 128 MB
Submit: 1098  Solved: 485
[Submit][Status][Discuss]

Description

Input

Output

Sample Input


Sample Input

Sample Output


Sample Output

HINT

Source

Vani原创 欢迎移步 OJ2648

Solution

双倍经验题,KD Tree模板题

KD Tree是一种切割多维空间的数据结构,主要用于多维空间信息的搜索(范围搜索和最近邻搜索)

大体上每层按照不同的维度进行左右建树,分开平面上的点,本质还是一颗平衡二叉树

效率大概是$O(log^{2}N)$的,比较暴力的做法

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define maxn 500010
int n,m,D;
struct PointNode
{
int d[],mn[],mx[],l,r;
PointNode(int x=,int y=) {l=r=;d[]=x;d[]=y;}
bool operator < (const PointNode & A) const {return d[D]<A.d[D];}
}p[maxn];
int dis(PointNode a,PointNode b) {return abs(a.d[]-b.d[])+abs(a.d[]-b.d[]);}
struct K_DTreeNode
{
int rt,ans;
PointNode Point,tree[maxn<<];
void Update(int now)
{
for (int i=; i<=; i++)
{
if (tree[now].l)
tree[now].mn[i]=min(tree[now].mn[i],tree[tree[now].l].mn[i]),tree[now].mx[i]=max(tree[now].mx[i],tree[tree[now].l].mx[i]);
if (tree[now].r)
tree[now].mn[i]=min(tree[now].mn[i],tree[tree[now].r].mn[i]),tree[now].mx[i]=max(tree[now].mx[i],tree[tree[now].r].mx[i]);
}
}
int BuildTree(int l,int r,int dd)
{
D=dd; int mid=(l+r)>>;
nth_element(p+l,p+mid,p+r+);
tree[mid]=p[mid];
for (int i=; i<=; i++) tree[mid].mn[i]=tree[mid].mx[i]=tree[mid].d[i];
if (l<mid) tree[mid].l=BuildTree(l,mid-,dd^);
if (r>mid) tree[mid].r=BuildTree(mid+,r,dd^);
Update(mid);
return mid;
}
void Insert(int now,int dd)
{
if (Point.d[dd]>=tree[now].d[dd])
if (tree[now].r) Insert(tree[now].r,dd^);
else
{
tree[now].r=++n; tree[n]=Point;
for (int i=; i<=; i++) tree[n].mn[i]=tree[n].mx[i]=tree[n].d[i];
}
else
if (tree[now].l) Insert(tree[now].l,dd^);
else
{
tree[now].l=++n; tree[n]=Point;
for (int i=; i<=; i++) tree[n].mn[i]=tree[n].mx[i]=tree[n].d[i];
}
Update(now);
}
int dist(int p1,PointNode p)
{
int re=;
for (int i=; i<=; i++) re+=max(,tree[p1].mn[i]-p.d[i]);
for (int i=; i<=; i++) re+=max(,p.d[i]-tree[p1].mx[i]);
return re;
}
void Query(int now,int dd)
{
int dl,dr,d0;
d0=dis(tree[now],Point);
if (d0<ans) ans=d0;
if (tree[now].l) dl=dist(tree[now].l,Point); else dl=0x7f7f7f7f;
if (tree[now].r) dr=dist(tree[now].r,Point); else dr=0x7f7f7f7f;
if (dl<dr)
{
if (dl<ans) Query(tree[now].l,dd^);
if (dr<ans) Query(tree[now].r,dd^);
}
else
{
if (dr<ans) Query(tree[now].r,dd^);
if (dl<ans) Query(tree[now].l,dd^);
}
}
void insert(PointNode _p){Point=_p; Insert(rt,);}
void init(){rt=BuildTree(,n,);}
int query(PointNode _p){Point=_p;ans=0x7fffffff; Query(rt,); return ans;}
}KDT;
int main()
{
// freopen("angel.in","r",stdin); freopen("angel.out","w",stdout);
n=read(),m=read();
for (int i=; i<=n; i++) p[i].d[]=read(),p[i].d[]=read();
KDT.init();
for (int i=; i<=m; i++)
{
int opt=read(),x=read(),y=read();
if (opt==) KDT.insert(PointNode(x,y));
if (opt==) printf("%d\n",KDT.query(PointNode(x,y)));
}
return ;
}

模板是参考的zky学长的,zky学长好神%%%

【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree的更多相关文章

  1. 【BZOJ 2648】SJY摆棋子 & 【BZOJ 2716】【Violet 3】天使玩偶

    KDTree模板,双倍经验啦啦啦- #include<cstdio> #include<cstring> #include<algorithm> #define r ...

  2. 【34.25%】【BZOJ 2648】SJY摆棋子

    Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 2718  Solved: 931 [Submit][Status][Discuss] Descrip ...

  3. 【BZOJ】【2648】SJY摆棋子&【BZOJ】【2716】【Violet 3】天使玩偶

    KD-Tree 传说中的kd树...前去膜拜了一下……写道模板题>_< 写kdtree的一些感想: 插入的时候是像可持久化线段树一样直接在最后开新节点,然后更新它所在的块.. 然而其实也是 ...

  4. BZOJ2648/2716:SJY摆棋子/[Violet]天使玩偶(K-D Tree)

    Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子. ...

  5. BZOJ.2716.[Violet3]天使玩偶(K-D Tree)

    题目链接 KD-Tree.因为插入过多点后可能会退化成链,所以左/右子树sz > α*整棵子树sz时对整棵子树进行重构. 树的节点数必须是3n?why?洛谷,BZOJ都这样..(数据范围错了吧 ...

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

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

  7. BZOJ 2648/2716(SJY把件-KD_Tree)[Template:KD_Tree]

    2648: SJY把件 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1180  Solved: 391 [id=2648" style= ...

  8. [bzoj2648/2716]SJY摆棋子

    平面上有n个点,要求支持插入一个点和查询一个点的最近点距离 n,m<=500000 用kdtree实现,但是复杂度貌似没法保证.....(莫名加了替罪羊重建更慢了...) #include< ...

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

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

随机推荐

  1. Docker简明教程(以安装wget程序为例)

    本文计划: 一.安装Docker(Centos) 二.注册Docker官网帐号 三.下载基础centos镜像,安装需要的软件和环境后,push到自己的repository 一.安装Docker(Cen ...

  2. 生产服务器环境最小化安装后 Centos 6.5优化配置[转]

    内容目录 centos6.5最小化安装后配置网络: IP地址, 网关, 主机名, DNS 更新系统源并且升级系统 系统时间更新和设定定时任 创建普通用户并进行sudo授权管理 修改SSH端口号和屏蔽r ...

  3. ItemIndex

    ItemIndex一般是列表的一个属性,比如TCombobox和TListBox都有,表示当前选中的项(Item)的下标(Index),如果没有选中,那它是-1,所以一般判断TCombox或TList ...

  4. Kafka及 .NET Core 客户端

    消息队列 Kafka 的基本知识及 .NET Core 客户端 消息队列 Kafka 的基本知识及 .NET Core 客户端   前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka ...

  5. nfs客户端报错解决Stale file handle

    NFS故障: 场景:客户端挂载是好的.服务端磁盘满了,重新给挂了一快.客户端df -h nfs挂载消失. 客户端报错:Stale file handle 现象如下: [root@test63-spri ...

  6. 让你彻底理解 “==”与 Equals

    相信很多朋友在面对,对象判等时经常会犹豫是用“==”还是Equals呢?有时候发现两者得到的结果相同,但有时候有不同, 究竟在什么情况下"==" 会相等,什么情况下Equals会不 ...

  7. WinObjc - 使用iOS项目生成通用Windows应用

    Github上一周年的WinObjc项目最近发布了预览版本,终于等到了这一天.WinObjc项目就是Build 2015大会上微软宣布的Project IslandWood项目,致力于将iOS应用快速 ...

  8. C# StopWatch的使用

    在做项目的时候,需要输出数据库操作的耗时,自己写了个方法.老大看到后,奇怪我为什么不用现成的.才知道有StopWatch这个类. 属性       名称 说明 Elapsed 获取当前实例测量得出的总 ...

  9. css+div 浮动分块

    前段时间学过几天html,只是怀着了解的态度,能够读懂别人的页面,能够扒现成就行,一直没有自己动手去实践过,其实也不是没有实践过,前段时间扒了一个网页,想按照自己的要求来改,可后果是越改越乱.今天心血 ...

  10. [转]搞ACM的你伤不起(转自Roba大神)

    劳资六年前开始搞ACM啊!!!!!!!!!! 从此踏上了尼玛不归路啊!!!!!!!!!!!! 谁特么跟劳资讲算法是程序设计的核心啊!!!!!! 尼玛除了面试题就没见过用算法的地方啊!!!!!! 谁再跟 ...