好久没写博客了 回去赶了好久文化课 颓欲见长
突然翻到fc爷的KD-Tree板子 来切了到裸题
对于一开始的数据我们可以先预处理 具体的排序方式见板子 其实就是我们对每次选定的一块选一个维度来排序啦 这里算了下方差 选最大的那一维来分下去

#include<bits/stdc++.h>
#define bug(x) cout<<(#x)<<" "<<(x)<<endl
#define ll long long
/*
char *TT,*mo,but[(1<<15)+2];
#define getchar() ((TT==mo&&(mo=(TT=but)+fread(but,1,1<<15,stdin),TT==mo))?-1:*TT++)//*/
using namespace std;
const int K=2,N=1e6+5;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct P{
int x[K];
}a[N];
struct T{
int x[K],min[K],max[K],split;
T *ls,*rs;
}pool[N],*num=pool,*rt;
int cmp_k,ans,n,m,sta,p[K];
bool cmp(P a,P b){
return a.x[cmp_k]<b.x[cmp_k];
}
void update(T *o,T *x){
if(!x) return;
for(int i=0;i<K;i++) o->min[i]=min(o->min[i],x->min[i]),o->max[i]=max(o->max[i],x->max[i]);
}
void build(T *&o,int l,int r){
if(l>r) {
o=0;return;
}
o=num++;
int d;double mx=-1;
for(int i=0;i<K;i++){
double ave=0,sum=0;
for(int j=l;j<=r;j++) ave+=a[j].x[i];ave/=r-l+1;
for(int j=l;j<=r;j++) sum+=(a[j].x[i]-ave)*(a[j].x[i]-ave);
if(sum>mx) mx=sum,d=i;
}
o->split=cmp_k=d;
int mid=(l+r)>>1;
nth_element(a+l,a+mid+1,a+r+1,cmp);
for(int i=0;i<K;i++) o->x[i]=o->min[i]=o->max[i]=a[mid].x[i];
build(o->ls,l,mid-1),update(o,o->ls);
build(o->rs,mid+1,r),update(o,o->rs);
}
void insert(T *&o,int kd=0){
if(!o){
o=num++;
o->split=(kd+1)%K;
for(int i=0;i<K;i++) o->x[i]=o->min[i]=o->max[i]=p[i];
return;
}
for(int i=0;i<K;i++) o->min[i]=min(o->min[i],p[i]),o->max[i]=max(o->max[i],p[i]);
int d=o->split;
if(p[d]<o->x[d]) insert(o->ls,d);
else insert(o->rs,d);
}
void upd(int x){
ans=min(ans,x);
}
int dist(int *x,int *y){
int ret=0;
for(int i=0;i<K;i++) ret+=abs(x[i]-y[i]);
return ret;
}
int dist(int *x,int *y,int *z){
int ret=0;
for(int i=0;i<K;i++)
if(y[i]>x[i])ret+=y[i]-x[i];
else if(x[i]>z[i])ret+=x[i]-z[i];
return ret;
}
void ask(T *o){
if(!o||dist(p,o->min,o->max)>=ans) return;
upd(dist(o->x,p));
int d=o->split;
if(p[d]<o->x[d]) ask(o->ls),ask(o->rs);
else ask(o->rs),ask(o->ls);
}
int main(){
#ifdef Devil_Gary
freopen("in.txt","r",stdin);
#endif
n=read(),m=read();
for(int i=1;i<=n;i++) for(int j=0;j<K;j++) a[i].x[j]=read();
build(rt,1,n);
while(m--){
sta=read();
for(int i=0;i<K;i++) p[i]=read();
if(sta==2) ans=1<<30,ask(rt),printf("%d\n",ans);
else insert(rt);
}
return 0;
}

BZOJ2716 KD-Tree的更多相关文章

  1. k-d tree 学习笔记

    以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...

  2. K-D tree入门

    久仰K-D tree大名已久,终于在合适的时候遇见了合适的水题入了坑入了门 K-D tree是什么 K-D tree是什么? 按名字上翻译来就是K维的树,就是一个用来维护K维空间的点的平衡二叉树 K- ...

  3. AOJ DSL_2_C Range Search (kD Tree)

    Range Search (kD Tree) The range search problem consists of a set of attributed records S to determi ...

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

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

  5. K-D Tree

    这篇随笔是对Wikipedia上k-d tree词条的摘录, 我认为解释得相当生动详细, 是一篇不可多得的好文. Overview A \(k\)-d tree (short for \(k\)-di ...

  6. K-D Tree题目泛做(CXJ第二轮)

    题目1: BZOJ 2716 题目大意:给出N个二维平面上的点,M个操作,分为插入一个新点和询问到一个点最近点的Manhatan距离是多少. 算法讨论: K-D Tree 裸题,有插入操作. #inc ...

  7. k-d Tree in TripAdvisor

    Today, TripAdvisor held a tech talk in Columbia University. The topic is about k-d Tree implemented ...

  8. k-d tree算法

    k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点匹配的时候就会利用到k ...

  9. k-d tree模板练习

    1. [BZOJ]1941: [Sdoi2010]Hide and Seek 题目大意:给出n个二维平面上的点,一个点的权值是它到其他点的最长距离减最短距离,距离为曼哈顿距离,求最小权值.(n< ...

  10. [模板] K-D Tree

    K-D Tree K-D Tree可以看作二叉搜索树的高维推广, 它的第 \(k\) 层以所有点的第 \(k\) 维作为关键字对点做出划分. 为了保证划分均匀, 可以以第 \(k\) 维排名在中间的节 ...

随机推荐

  1. 【codeforces】【比赛题解】#854 CF Round #433 (Div.2)

    cf一如既往挺丧 看丧题点我! [A]分数 Petya是数学迷,特别是有关于分数的数学.最近他学了所谓一个分数被叫做“真分数”当且仅当其分子小于分母,而一个分数被叫做“最简分数”当且仅当其分子分母互质 ...

  2. CentOS配置163yum源

    1.下载repo文件 wget http://mirrors.163.com/.help/CentOS6-Base-163.repo 2.备份并替换系统的repo文件 [root@localhost ...

  3. Windows 10安装uWSGI:不可行、失败了

    Windows 10家庭中文版,Python 3.6.4,uwsgi-2.0.17.tar.gz,压缩工具-7-zip 提示:请不要和我一样尝试,浪费时间,去Linux上玩吧! 几个小时的安装经历 昨 ...

  4. 排序与相关性(Sorting and Relevance)

    本文翻译自Elasticsearch官方指南的Sorting and Relevance一章的第一节. 原文地址:http://www.elastic.co/guide/en/elasticsearc ...

  5. IE手工导入证书

    打开cer文件->欢迎使用证书导入向导->下一步->将所有的证书放入下列存储->受信任的根证书颁发机构->完成

  6. linux nat网络配置

    1. 2 . 3. BOOTPROTO = static ONBOOT=yes  #开启自动启用网络连接 IPADDR0=192.168.21.128  #设置IP地址 PREFIXO0=24  #设 ...

  7. thinkphp5 url传参

    url('index/blog/read',['id'=>5,'name'=>'thinkphp']); 手册https://www.kancloud.cn/manual/thinkphp ...

  8. Datagridview 中的checkbox 选中或勾选状态失效

    1.问题描述,先选中第一行,再取消选择,然后点击部门全选,第一行没有打钩,状态是不选中的状态. 2.分析代码 先选中第一行,单元格的单击事件中 改变选中状态为1,第一行取消选择,单元格的单击事件中 改 ...

  9. WordPress用户登录后重定向到指定页面

    这篇文章将向您展示WordPress用户登录后如何重定向到指定页面或者文章的技巧. 一.重定向到网站管理面板. 将以下代码添加到您的当前主题的 functions.php 文件中: function  ...

  10. Kotlin尝试

    Kotlin 是一种静态类型的编程语言,可在 Java 虚拟机上运行,也可以编译为 JavaScript 源代码.其主要发展来自位于俄罗斯圣彼得堡的 JetBrains 程序员团队.虽然语法与 Jav ...