bzoj2648/2716 kdtree
SJY摆棋子
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 5199 Solved: 1813
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 1
2 3
2 1 2
1 3 3
2 4 2
Sample Output
2
HINT
kdtree可以过
Source
#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的更多相关文章
- 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2459 Solved: 834[Submit][Status][Discu ...
- [bzoj2648/2716]SJY摆棋子_KD-Tree
SJY摆旗子 bzoj-2648 题目大意:平面上有n个黑子.有m个操作,可以下一颗白子,查询与曼哈顿距离下最近黑子之间的曼哈顿距离,或者下一颗黑子. 注释:$1\le n,m\le 5\cdot 1 ...
- [bzoj2648/2716]SJY摆棋子
平面上有n个点,要求支持插入一个点和查询一个点的最近点距离 n,m<=500000 用kdtree实现,但是复杂度貌似没法保证.....(莫名加了替罪羊重建更慢了...) #include< ...
- BZOJ2648/2716:SJY摆棋子/[Violet]天使玩偶(K-D Tree)
Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子. ...
- BZOJ 2716 [Violet 3]天使玩偶 ——KD-Tree
[题目分析] KD-Tree的例题.同BZOJ2648. [代码] #include <cstdio> #include <cstring> #include <cstd ...
- 【BZOJ】2648: SJY摆棋子 & 2716: [Violet 3]天使玩偶(kdtree)
http://www.lydsy.com/JudgeOnline/problem.php?id=2716 http://www.lydsy.com/JudgeOnline/problem.php?id ...
- BZOJ2648 SJY摆棋子(KD-Tree)
板子题. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree
2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec Memory Limit: 128 MB Description 这天,S ...
- 【BZOJ2648】SJY摆棋子(KD-Tree)
[BZOJ2648]SJY摆棋子(KD-Tree) 题面 BZOJ Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一 ...
随机推荐
- ftpclient 遇到的一些问题
1. FTPFile[] files=ftpClient.listFiles(ftpDirectory); 没有数据 public static boolean ftpLogin(String ser ...
- Date/Time Functions and Operators (Postgres)
http://www.postgresql.org/docs/9.1/static/functions-datetime.html Search Documentation: H ...
- 增加和减少mongodb复制集中的节点
MongoDB Replica Sets不仅提供高可用性的解决方案,同时也提供负载均衡的解决方案,增减 Replica Sets节点在实际应用中非常普通.例如,当应用的读压力暴增时,3台节点的环境已不 ...
- 使用JavaScript调用手机平台上的原生API
我之前曾经写过一篇文章使用Cordova将您的前端JavaScript应用打包成手机原生应用,介绍了如何使用Cordova框架将您的用JavaScript和HTML开发的前端应用打包成某个手机平台(比 ...
- Java动态代理之InvocationHandler最简单的入门教程
网上关于Java的动态代理,Proxy和InvocationHandler这些概念有讲解得非常高深的文章.其实这些概念没有那么复杂.现在咱们通过一个最简单的例子认识什么是InvocationHandl ...
- Android串口通信
前段时间因为工作需要研究了一下android的串口通信,网上有很多讲串口通信的文章,我在做的时候也参考了很多文章,现在就将我学习过程中的一些心得分享给大家,希望可以帮助大家在学习的时候少走一些弯路,有 ...
- 查看进程lsof
查看8000端口 lsof -i :8000 杀死进程 pkill -ns <pid>
- DRBD+NFS+Keepalived高可用环境
1.前提条件 准备两台配置相同的服务器 2.安装DRBD [root@server139 ~]# yum -y update kernel kernel-devel [root@server139 ~ ...
- jQuery备忘录
jquery 中遍历数组 var arr = [1,2,3,4,5] $.each(arr,function(i,j){ console.log(i,j) }) 结果 0 1 1 2 .... jQu ...
- pb2.text_format.Merge(f.read(), self.solver_param) AttributeError: 'module' object has no attribute 'text_format'
http://blog.csdn.net/qq_33202928/article/details/72526710