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

Solution

K-D Tree模板题,注意不替罪羊重构的话会TLE

Code

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define N (1000000+1000)
#define INF 0x7fffffff
using namespace std; int n,m,D,ans,opt,x,y,Root;
double alpha=0.75; struct Node
{
int d[],Max[],Min[],lson,rson,size;
bool operator < (const Node &a) const {return d[D]<a.d[D];}
Node (int x=,int y=)
{
lson=rson=; d[]=x; d[]=y;;
Max[]=Min[]=d[];
Max[]=Min[]=d[];
}
}p[N],T; int stack[N],cnt,top;
int NewNode()
{
if (top) return stack[top--];
return ++cnt;
} struct KDT
{
Node Tree[N]; void Update(int now)
{
int ls=Tree[now].lson,rs=Tree[now].rson;
for (int i=; i<=; ++i)
{
Tree[now].Max[i]=Tree[now].Min[i]=Tree[now].d[i];
if (ls)
{
Tree[now].Max[i]=max(Tree[now].Max[i],Tree[ls].Max[i]);
Tree[now].Min[i]=min(Tree[now].Min[i],Tree[ls].Min[i]);
}
if (rs)
{
Tree[now].Max[i]=max(Tree[now].Max[i],Tree[rs].Max[i]);
Tree[now].Min[i]=min(Tree[now].Min[i],Tree[rs].Min[i]);
}
}
Tree[now].size=Tree[ls].size+Tree[rs].size+;
}
int Build(int opt,int l,int r)
{
if (l>r) return ;
int mid=(l+r)>>,now=NewNode();
D=opt; nth_element(p+l,p+mid,p+r+);
Tree[now]=p[mid]; Tree[now].size=;
Tree[now].lson=Build(opt^,l,mid-);
Tree[now].rson=Build(opt^,mid+,r);
Update(now);
return now;
}
int Get_min(int now)
{
int ans=;
for (int i=; i<=; ++i)
{
ans+=max(,T.d[i]-Tree[now].Max[i]);
ans+=max(,Tree[now].Min[i]-T.d[i]);
}
return ans;
}
void Query(int now)
{
ans=min(ans,abs(T.d[]-Tree[now].d[])+abs(T.d[]-Tree[now].d[]));
int ls=Tree[now].lson,rs=Tree[now].rson,lans=INF,rans=INF;
if (ls) lans=Get_min(ls);
if (rs) rans=Get_min(rs);
if (lans<rans)
{
if (lans<ans) Query(ls);
if (rans<ans) Query(rs);
}
else
{
if (rans<ans) Query(rs);
if (lans<ans) Query(ls);
}
}
void Dfs(int now,int sz)
{
int ls=Tree[now].lson,rs=Tree[now].rson;
if (ls) Dfs(ls,sz);
p[sz+Tree[ls].size]=Tree[now];
stack[++top]=now;
if (rs) Dfs(rs,sz+Tree[ls].size+);
}
void Check(int &now,int opt)
{
int ls=Tree[now].lson, rs=Tree[now].rson;
if (Tree[ls].size>alpha*Tree[now].size || Tree[rs].size>alpha*Tree[now].size)
{
Dfs(now,);
now=Build(opt,,Tree[now].size);
}
}
void Insert(int &now,int x,int opt)
{
if (Tree[x].d[opt]<=Tree[now].d[opt])
{
if (Tree[now].lson) Insert(Tree[now].lson,x,opt^);
else Tree[now].lson=x;
}
else
{
if (Tree[now].rson) Insert(Tree[now].rson,x,opt^);
else Tree[now].rson=x;
}
Update(now); Check(now,opt);
}
}KDT; int main()
{
scanf("%d%d",&n,&m);
for (int i=; i<=n; ++i)
{
scanf("%d%d",&x,&y);
p[i].d[]=x; p[i].d[]=y;
}
Root=KDT.Build(,,n);
for (int i=; i<=m; ++i)
{
scanf("%d%d%d",&opt,&x,&y);
if (opt==)
{
int t=NewNode();
KDT.Tree[t]=Node(x,y);
KDT.Tree[t].size=;
KDT.Insert(Root,t,);
}
else
{
T.d[]=x; T.d[]=y; ans=INF;
KDT.Query(Root);
printf("%d\n",ans);
}
}
}

BZOJ2648/2716:SJY摆棋子/[Violet]天使玩偶(K-D Tree)的更多相关文章

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

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

  2. [bzoj2648/2716]SJY摆棋子

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

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

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

  4. 【BZOJ2648】SJY摆棋子 KDtree

    [BZOJ2648]SJY摆棋子 Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找 ...

  5. SJY摆棋子&&[Violet 3]天使玩偶

    SJY摆棋子 https://www.lydsy.com/JudgeOnline/problem.php?id=2648 [Violet 3]天使玩偶 https://www.lydsy.com/Ju ...

  6. 【BZOJ2648】SJY摆棋子 [KD-tree]

    SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 这天,SJY显得无聊.在家自己 ...

  7. 【bzoj2648】 SJY摆棋子

    http://www.lydsy.com/JudgeOnline/problem.php?id=2648 (题目链接) 题意 动态维护二维平面上的点的插入以及最邻近域搜索. Solution KDtr ...

  8. 【BZOJ2648】SJY摆棋子

    题目大意:维护一个二维平面,平面上初始有 N 个点,支持两种操作:平面加点.查询距离某个指定点的最小哈密顿距离. 题解:学习到了 kd-tree 数据结构. kd-tree 类似于平衡树,即:每个节点 ...

  9. BZOJ2648:SJY摆棋子

    浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...

随机推荐

  1. ajax请求php,在返回信息前面出现了奇怪的红点点

    如果你返回的json数据带有小红点,那么前台ajax是不认的,并且老是走ajax的error方法,不走success方法,因为ajax的dataType:“json”,你指定了返回的是json格式,j ...

  2. mongodb的增删改查

    show dbs 显示所有有数据的数据库 use dbname:如use ela; 如果指定的数据库不存在,就会创建,否则就会切到该数据库上. db 显示当前数据库 db.dropDatabase() ...

  3. mysql explain工具使用

    explain工具可以确认执行计划是否良好,查询是否走了合理的索引.查询的执行计划,随着数据的变化也可能会有变化.调用方式:explain + [sql语句]. 另外,explain是有局限性的:1. ...

  4. GreenPlum 大数据平台--基础使用(一)

    一,操作语法 01,创建数据库 --创建用户-- [gpadmin@greenplum01 ~]$ export PGDATABASE=testDB --指定数据库名字 [gpadmin@greenp ...

  5. EditText属性

    来自http://mp.weixin.qq.com/s/Yncr0XZ4MCWZH2vzTVyYJw android:inputType=”none”android:inputType=”text”a ...

  6. svn server配置与TortoiseSVN、Ankhsvn+VS使用

    Svn服务器与客户端安装 1.      下载安装VisualSvn-Server服务端.(过程略)http://subversion.apache.org/packages.html 2.      ...

  7. 用R处理不平衡的数据

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文来自云+社区翻译社,作者ArrayZoneYour 在分类问题当中,数据不平衡是指样本中某一类的样本数远大于其他的类别样本数.相比于多分 ...

  8. nyoj 600——花儿朵朵——【离散化、线段树插线问点】

    花儿朵朵 时间限制:1000 ms  |  内存限制:65535 KB 难度:5   描述 春天到了,花儿朵朵盛开,hrdv是一座大花园的主人,在他的花园里种着许多种鲜花,每当这个时候,就会有一大群游 ...

  9. Scanners-Box:开源扫描器大全 2017-04-22

    Scanners-Box:开源扫描器大全 2017-04-22 Scanners-Box是一个集合github平台上的安全行业从业人员自研开源扫描器的仓库,包括子域名枚举.数据库漏洞扫描.弱口令或信息 ...

  10. 【转】 ASP.NET使用ICallbackEventHandler无刷新验证用户名是否可用

    功能说明:当用户在用户名输入框输入字符并焦点离开此输入框时,自动到数据库用户表中验证此用户名是否已被注册,如果已被注册,显示[不可用],反之,显示[可用],期间页面不刷新,读者也可以考虑将提示文字换成 ...