SJY摆棋子

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 5199  Solved: 1813
[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

 
题解:kdtree的应用,查询最近的距离,就是缩小范围,和最优性剪枝即可过了。
 #include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstdio> #define inf 1000000007
#define N 500007
#define ll long long
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,m,rt,F;
struct Node
{
int d[],mn[],mx[],l,r;
int& operator[](int x)
{
return d[x];
}
Node(int x=,int y=)//无代入的话x,y为0,代入即为代入值。
{
l=,r=;
d[]=x,d[]=y;
}
}p[N];
bool operator<(Node x,Node y)
{
return x[F]<y[F];
}
inline int dis(Node x,Node y)
{
return abs(x[]-y[])+abs(x[]-y[]);
}
struct kdtree
{
int ans;
Node tr[N*],T;
void update(int p)
{
Node l=tr[tr[p].l],r=tr[tr[p].r];
for (int i=;i<;i++)
{
if (tr[p].l)tr[p].mn[i]=min(tr[p].mn[i],l.mn[i]),tr[p].mx[i]=max(tr[p].mx[i],l.mx[i]);
if (tr[p].r)tr[p].mn[i]=min(tr[p].mn[i],r.mn[i]),tr[p].mx[i]=max(tr[p].mx[i],r.mx[i]);
}
}
int build(int l,int r,int now)
{
F=now;int mid=(l+r)>>;
nth_element(p+l,p+mid,p+r+);
tr[mid]=p[mid];
for (int i=;i<;i++)
tr[mid].mn[i]=tr[mid].mx[i]=tr[mid][i];
if (l<mid)tr[mid].l=build(l,mid-,now^);
if (r>mid)tr[mid].r=build(mid+,r,now^);
update(mid);
return mid;
}
void ins(int p,int now)
{
if (T[now]>=tr[p][now])
{
if(tr[p].r)ins(tr[p].r,now^);
else
{
tr[p].r=++n,tr[n]=T;
for (int i=;i<;i++)
tr[n].mn[i]=tr[n].mx[i]=tr[n][i];
}
}
else
{
if (tr[p].l)ins(tr[p].l,now^);
else
{
tr[p].l=++n,tr[n]=T;
for (int i=;i<;i++)
tr[n].mn[i]=tr[n].mx[i]=tr[n][i];
}
}
update(p);
}
int get(int k,Node p)
{
int tmp=;
for (int i=;i<;i++)
tmp+=max(,tr[k].mn[i]-p[i]);
for (int i=;i<=;i++)
tmp+=max(,p[i]-tr[k].mx[i]);
return tmp;
}
void query(int p,int now)
{
int d,dl=inf,dr=inf;
d=dis(tr[p],T);
ans=min(ans,d);
if (tr[p].l)dl=get(tr[p].l,T);
if (tr[p].r)dr=get(tr[p].r,T);
if (dl<dr)
{
if (dl<ans)query(tr[p].l,now^);
if (dr<ans)query(tr[p].r,now^);
}
else
{
if (dr<ans)query(tr[p].r,now^);
if (dl<ans)query(tr[p].l,now^);
}
}
int query(Node p)
{
ans=inf,T=p,query(rt,);
return ans;
}
void ins(Node p)
{
T=p;
ins(rt,);
}
}kd;
int main()
{
freopen("fzy.in","r",stdin);
freopen("fzy.out","w",stdout); n=read(),m=read();
for (int i=;i<=n;i++)
p[i][]=read(),p[i][]=read();
rt=kd.build(,n,);//后者0,代表维的循环
while(m--)
{
int flag=read(),x=read(),y=read();
if (flag==) kd.ins(Node(x,y));
else printf("%d\n",kd.query(Node(x,y)));
}
}

bzoj2648/2716 kdtree的更多相关文章

  1. 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2459  Solved: 834[Submit][Status][Discu ...

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

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

  3. [bzoj2648/2716]SJY摆棋子

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

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

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

  5. BZOJ 2716 [Violet 3]天使玩偶 ——KD-Tree

    [题目分析] KD-Tree的例题.同BZOJ2648. [代码] #include <cstdio> #include <cstring> #include <cstd ...

  6. 【BZOJ】2648: SJY摆棋子 & 2716: [Violet 3]天使玩偶(kdtree)

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

  7. BZOJ2648 SJY摆棋子(KD-Tree)

    板子题. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

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

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

  9. 【BZOJ2648】SJY摆棋子(KD-Tree)

    [BZOJ2648]SJY摆棋子(KD-Tree) 题面 BZOJ Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一 ...

随机推荐

  1. SQL简单查询后续记录

    --首先创建数据库TEST CREATE DATABASE TEST --创建表tb_user USE TEST CREATE TABLE [tb_user]( [name] [nvarchar] ( ...

  2. JBOSS连接池默认连接数是多少?在哪个配置文件有这个默认的连接数?

    如果你用的是是4.x的Jboss的话,请参考:docs/dtd/jboss-ds_1_0.dtd,相信你很容易就能找到控制最大/最小连接数的选项,应该是诸如:max-pool-size/min-poo ...

  3. write命令

    write——给用户发信息,以Ctrl+D保存结束 命令所在路径:/usr/bin/write 示例1: # write xiaohua 执行命令后可以输入需要发送的信息,如下: 同时xiaohua收 ...

  4. 9.18 New Start

    好久没上cnblogs,今天提示我说园龄已经2年1个月了.今天就用一个日记的形式开始第一篇博客吧.我以后比较精髓的文章就放在cnblogs,csdn博客也继续会更新,不过也会慢慢提高文章质量. 今天是 ...

  5. (转)MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql

    http://blog.csdn.net/yerenyuan_pku/article/details/71893689 前面对MyBatis框架的学习中,我们对Mapper.xml映射文件多少有些了解 ...

  6. The - Modcrab——使用贪心策略

    一.题目信息 The - Modcrab 简单翻译一下:Vova有生命值h1,每次攻击值为a1,每瓶药水恢复生命值c1;Modcrab有生命值h2,每次攻击值为a2.在每个关卡开始,Vova有两种选择 ...

  7. java B转换KB MB GB TB PB EB ZB

    public static String readableFileSize(long size) { if (size <= 0) { return "0"; } final ...

  8. common-fileupload上传图片并显示图片

    效果图如下:                                   代码: 注意:需要jar包:commons-fileupload-1.2.1.jar  和 commons-io-1. ...

  9. oracle中group by的高级用法

    简单的group by用法 select c1,sum(c2) from t1 where t1<>'test' group by c1 having sum(c2)>100; ro ...

  10. javaEE(7)_自定义标签&JSTL标签(JSP Standard Tag Library)

    一.自定义标签简介 1.自定义标签主要用于移除Jsp页面中的java代码,jsp禁止出现一行java脚本. 2.使用自定义标签移除jsp页面中的java代码,只需要完成以下两个步骤: •编写一个实现T ...