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. Meet python: little notes 4 - high-level characteristics

    Source: http://www.liaoxuefeng.com/ ♥ Slice Obtaining elements within required range from list or tu ...

  2. AASM rule of scoring sleep stages using EEG signal

    Reference: AASM (2007). The AASM Manual for the Scoring of Sleep and Associated Events: Rules, Termi ...

  3. Windows 8 开发系列汇总

    Windows 8 应用开发 Windows 8 应用开发 - 异步调用 Windows 8 应用开发 - 本地数据存储 Windows 8 应用开发 - 挂起与恢复 Windows 8 应用开发 - ...

  4. swift 初探NSURLSession

    进行封装, 新建一个类.network class Network1: NSObject { // 没有参数+结果的get  自定义 HTTP method 和 URL+闭包 static func ...

  5. JQuery实现资讯上下滚动悬停效果

    第一步:使用repeater绑定一个table. <table width="530" id="rollBar"> <asp:Repeater ...

  6. 对《重建中国.NET生态系统》评论贴的总结

    Neuzilla官方微信公众号:搜 架构师联盟 或 neuzilla,也可以扫下面二维码 在看了<重建中国.NET生态系统>的各种哭爹喊娘骂街的评论之后,我觉得哦,淫才确实很多,但是么真正 ...

  7. 通向高可扩展性之路(推特篇) ---- 一个推特用来支撑1亿5千万活跃用户、30万QPS、22MB每秒Firehose、以及5秒内推送信息的架构

    原文链接:http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active ...

  8. [C语言]一个很实用的服务端和客户端进行UDP通信的实例

    前段时间发了个TCP通信的例子,现在再来一个UDP通信的例子.这些可以作为样本程序,用到开发中.“裸写”socket老是记不住步骤,经常被鄙视…… 下面的例子很简单,写一个UDP的server用于收包 ...

  9. HTML5+JS 《五子飞》游戏实现(三)页面和棋盘棋子

    前面两节,我们已经对<五子飞>有个初步的认识,对走棋路线也有了基本的了解,现在里沃特继续跟大家分享HTML页面,另外把棋盘棋子也画出来. 演示地址:http://www.lyout.com ...

  10. PHP学习资料分享

    PHP有着开源.执行效率高.优化代码运行等特性,功能强大,被广泛运用,很多大型企业网站开发的首选,百度.腾讯.新浪.金山等均采用了PHP开发.学好PHP对网络开发人员而言具有很好的发展前景,市场对PH ...