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个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一 ...
随机推荐
- 使用JOSM编辑OpenStreetMap地图
申明:转载请注明出处! 网上关于JOSM的使用大多只介绍了如何安装和优缺点,对于我这种小白完全还是不会,于是Google了一番,国外关于JOSM的使用的文章还是很多的, 选中一篇讲解的非常详细来翻译, ...
- codevs 1262 不要把球传我 2012年CCC加拿大高中生信息学奥赛
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description CCC的足球比赛和传统的足球比赛有一点不同, 一次进球当且仅当先后接触到球的 ...
- Servlet和JSP之标签文件学习
在上一篇文章中介绍了自定义标签的用法,接下来介绍标签文件的用法啦. tag file指令 tag file简介 用tag file的方式,无需编写标签处理类和标签库描述文件,也可以自定义标签.tag ...
- Python 目录和文件基本操作
今天在写一个小工具的过程中发现对目录和文件的基本操作不是很熟,特此把遇到的常用操作总结汇总下. 获取当前路径:os.getcwd() 目录操作:1.创建目录:os.mkdir('目录名')2.创建多级 ...
- cookie安全
www.baidu.com host 文件 定义 a.baidu.com 为127.0.01 本地编写php程序 读取浏览器发送给 a.baidu.com的cookie 会把 .baidu.com域下 ...
- activeandroid复制本地数据库问题总结
activeandroid no such table 解决activeandroid no such table failed to read row 0 column 1 from a curso ...
- 单调栈2 POJ3250 类似校内选拔I题
这个题再次证明了单调栈的力量 简单 单调栈 类似上次校内选拔消砖块 一堆牛面朝右排 给出从左到右的 问每个牛的能看到前面牛发型的个数之和 //re原因 因为在执行pop的时候没有判断empty 程序崩 ...
- MAC 安装汇编编译工具 NASM
直接运行nasm报错: 开始安装: brew reinstall nasm
- C++类型强制转换<转>
转载:http://www.cnblogs.com/goodhacker/archive/2011/07/20/2111996.html C风格的强制类型转换(Type Cast)很简单,不管什么类型 ...
- KVM 重命名虚机
KVM 重命名虚机 1. 查看虚机列表 [root@bjape01-kvm1 ~]# virsh list --all Id 名称 状态 --- ...