bzoj 2648 KD-tree
稍微看了一下KD-tree的讲义,大概明白了它的原理,但是实现不出来。。。
所以无耻的抄了一下黄学长的。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define inf 1000000000
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*+ch-'';ch=getchar();}
return x*f;
}
int n,m,root,D;
struct node
{
int d[],mn[],mx[],l,r;
int& operator[](int x){return d[x];}
node(int x=,int y=)
{
l=,r=,d[]=x,d[]=y;
}
}p[];
bool operator <(node a,node b)
{
return a[D]<b[D];
}
inline int dis(node a,node b)
{
return abs(a[]-b[])+abs(a[]-b[]);
}
struct kdtree
{
int ans;
node t[],T;
void update(int k)
{
node l=t[t[k].l],r=t[t[k].r];
for(int i=;i<;i++)
{
if(t[k].l)t[k].mn[i]=min(t[k].mn[i],l.mn[i]),t[k].mx[i]=max(t[k].mx[i],l.mx[i]);
if(t[k].r)t[k].mn[i]=min(t[k].mn[i],r.mn[i]),t[k].mx[i]=max(t[k].mx[i],r.mx[i]);
}
}
int build(int l,int r,int now)
{
D=now;
int mid=(l+r)>>;
nth_element(p+l,p+mid,p+r+);
t[mid]=p[mid];
for(int i=;i<;i++)
t[mid].mn[i]=t[mid].mx[i]=t[mid][i];
if(l<mid)t[mid].l=build(l,mid-,now^);
if(r>mid)t[mid].r=build(mid+,r,now^);
update(mid);
return mid;
}
void insert(int k,int now)
{
if(T[now]>=t[k][now])
{
if(t[k].r)insert(t[k].r,now^);
else
{
t[k].r=++n;t[n]=T;
for(int i=;i<;i++)
t[n].mn[i]=t[n].mx[i]=t[n][i];
}
}
else
{
if(t[k].l)insert(t[k].l,now^);
else
{
t[k].l=++n;t[n]=T;
for(int i=;i<;i++)
t[n].mn[i]=t[n].mx[i]=t[n][i];
}
}
update(k);
}
int get(int k,node p)
{
int tmp=;
for(int i=;i<;i++)
tmp+=max(,t[k].mn[i]-p[i]);
for(int i=;i<;i++)
tmp+=max(,p[i]-t[k].mx[i]);
return tmp;
}
void query(int k,int now)
{
int d,dl=inf,dr=inf;
d=dis(t[k],T);
ans=min(ans,d);
if(t[k].l)dl=get(t[k].l,T);
if(t[k].r)dr=get(t[k].r,T);
if(dl<dr)
{
if(dl<ans)query(t[k].l,now^);
if(dr<ans)query(t[k].r,now^);
}
else
{
if(dr<ans)query(t[k].r,now^);
if(dl<ans)query(t[k].l,now^);
}
}
int query(node p)
{
ans=inf;T=p;query(root,);
return ans;
}
void insert(node p)
{
T=p;insert(root,);
}
}kd;
int main()
{
n=read();m=read();
for(int i=;i<=n;i++)p[i][]=read(),p[i][]=read();
root=kd.build(,n,);
while(m--)
{
int opt=read(),x=read(),y=read();
if(opt==)kd.insert(node(x,y));
else printf("%d\n",kd.query(node(x,y)));
}
return ;
}
bzoj 2648 KD-tree的更多相关文章
- BZOJ - 2648 KD树 最近点查询
省赛后躺尸几天又回来更新了,内容是说好的KD树.. 具体操作从代码中感受一下 感觉已经把KD树尽量封装好了(虽然全局的D看着极不顺眼) 需要注意的是估值函数的判断条件 #include<bits ...
- BZOJ 2648: SJY摆棋子(K-D Tree)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 6051 Solved: 2113[Submit][Status][Discuss] Descript ...
- BZOJ 3489: A simple rmq problem(K-D Tree)
Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 2579 Solved: 888[Submit][Status][Discuss] Descripti ...
- BZOJ 3053: The Closest M Points(K-D Tree)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1235 Solved: 418[Submit][Status][Discuss] Descripti ...
- BZOJ 4520: [Cqoi2016]K远点对(k-d tree)
Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1162 Solved: 618[Submit][Status][Discuss] Descripti ...
- BZOJ 1941: [Sdoi2010]Hide and Seek(k-d Tree)
Time Limit: 16 Sec Memory Limit: 162 MBSubmit: 1712 Solved: 932[Submit][Status][Discuss] Descripti ...
- k-d tree模板练习
1. [BZOJ]1941: [Sdoi2010]Hide and Seek 题目大意:给出n个二维平面上的点,一个点的权值是它到其他点的最长距离减最短距离,距离为曼哈顿距离,求最小权值.(n< ...
- 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2459 Solved: 834[Submit][Status][Discu ...
- K-D Tree题目泛做(CXJ第二轮)
题目1: BZOJ 2716 题目大意:给出N个二维平面上的点,M个操作,分为插入一个新点和询问到一个点最近点的Manhatan距离是多少. 算法讨论: K-D Tree 裸题,有插入操作. #inc ...
- kd-tree注解 & bzoj 2648 & 2716 & 3053 解决问题的方法
[KD-TREE简介]于SYC1999大神"迷住"下一个.我开始接触这样的算法. 首先.这个概念大概能去百度百科.详细的实施.我在看RZZ的代码长大的. 我们能够想象在平面上有N个 ...
随机推荐
- iOS JsonModel 的使用
本文转自:http://blog.csdn.net/smking/article/details/40432287 下面讲一下JSONModel的使用方法. @inteface MyModel : J ...
- linux版基金看板
程序员的吊丝们,还在害怕上班时偷偷看基金被老板发现吗?今天你们的福利来了,专属程序员吊丝一族的礼物,linux版基金看板. 优点: 1.自定义设置关注基金 2.linux系统,让别人可以以为你一直都在 ...
- 解析UML箭头、线条代表的意义(转)
在学习UML过程中,你经常会遇到UML类图关系,这里就向大家介绍一下UML箭头.线条代表的意义,相信通过本文的介绍你对UML中箭头.线条的意义有更明确的认识. AD: 本节向大家学习一下UML箭头.线 ...
- JVM之CMS收集器
CMS(Concurrent Mark Sweep) 最短回收停顿,适合维持响应时间上的要求. 初始标记 Initial mark:标记GC Roots能够关联到的对象.stop-mark. 并发标记 ...
- 聊下git merge --squash
你经常会面临着将dev分支或者很多零散的分支merge到一个公共release分支里. 但是有一种情况是需要你处理的,就是在你的dev的分支里有很多commit记录.而这些commit是无需在rele ...
- W3School-CSS 表格实例
CSS 表格实例 CSS 实例 CSS 背景实例 CSS 文本实例 CSS 字体(font)实例 CSS 边框(border)实例 CSS 外边距 (margin) 实例 CSS 内边距 (paddi ...
- Webservice详解
WebService是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨平台的规范(抽象) 3. 多个跨平台.跨语言的应用间通信整合的方案(实际) ...
- MySQL InnoDB表--BTree基本数据结构
MySQL InnoDB表是索引组织表这一点应该是每一个学习MySQL的人都会首先学到的知识,这代表这表中的数据是按照主键顺序存储,也就是说BTree的叶子节点存储了所有该行的数据. 我最开始是搞Or ...
- php应用jquery做ajax操作
以下是全部代码: <html> <head> <title>jQuery Ajax 实例演示</title> </head> <scr ...
- UVA - 11584 Partitioning by Palindromes[序列DP]
UVA - 11584 Partitioning by Palindromes We say a sequence of char- acters is a palindrome if it is t ...