LINK:数据

这是一个我写过的最标准的板子。

重构什么的写的非常的标准 常数应该也算很小的。

不过虽然过了题 我也不知道代码是否真的无误 反正我已经眼查三遍了...

重构:建议先插入 插入过程中找到第一个不平衡的点再重构。

最小距离查询剪枝:当前坐标为mn和mx中间的时候显然 最小距离可能为0 否则 为他们其中之一和当前坐标的差。

最大距离查询剪枝:当前坐标和mn以及mx的最大距离差。

const int MAXN=500010,K=2;
const db alpha=0.75;
int n,root,top,D,Q,cnt,ans;
struct wy
{
int d[K];
int mn[K],mx[K];
int sz,l,r;
}t[MAXN];
int q[MAXN];
inline int cmp(int a,int b){return t[a].d[D]<t[b].d[D];}
inline void update(int x)
{
sz(x)=sz(l(x))+sz(r(x))+1;
for(int i=0;i<K;++i)
{
if(l(x))t[x].mx[i]=max(t[x].mx[i],t[l(x)].mx[i]),t[x].mn[i]=min(t[x].mn[i],t[l(x)].mn[i]);
if(r(x))t[x].mx[i]=max(t[x].mx[i],t[r(x)].mx[i]),t[x].mn[i]=min(t[x].mn[i],t[r(x)].mn[i]);
}
}
inline int build(int l,int r,int k)
{
if(l>r)return 0;
int mid=(l+r)>>1;D=k;
nth_element(q+l,q+mid,q+1+r,cmp);
int x=q[mid];
for(int i=0;i<K;++i)t[x].mx[i]=t[x].mn[i]=t[x].d[i];
l(x)=build(l,mid-1,(k+1)%K);
r(x)=build(mid+1,r,(k+1)%K);
update(x);return x;
}
inline void erase(int x)
{
if(!x)return;q[++top]=x;
erase(l(x));erase(r(x));
}
inline void rebuild(int &x,int k)
{
top=0;erase(x);
x=build(1,top,k);
}
inline void insert(int &p,int k,int flag)
{
if(!p)
{
p=++cnt;sz(p)=1;
for(int i=0;i<K;++i)t[p].mx[i]=t[p].mn[i]=t[p].d[i]=q[i];
return;
}
int mark=0;
if(q[k]<t[p].d[k])
{
if((sz(l(p))+1)>=alpha*(sz(p)+1))mark=1;
insert(l(p),(k+1)%K,flag|mark);
}
else
{
if((sz(r(p)+1)>=alpha*(sz(p)+1)))mark=1;
insert(r(p),(k+1)%K,flag|mark);
}
if(!flag&&mark)rebuild(p,k);
update(p);
}
inline int dis(int x)
{
int cnt=0;
rep(0,K-1,i)cnt+=abs(t[x].d[i]-q[i]);
return cnt;
}
inline int dismin(int x)//查当前离节点最近的距离
{
int cnt=0;
rep(0,K-1,i)if(q[i]<t[x].mn[i])cnt+=t[x].mn[i]-q[i];
else if(q[i]>t[x].mx[i])cnt+=q[i]-t[x].mx[i];
return cnt;
}
inline void ask_min(int x)
{
ans=min(ans,dis(x));
int L=dismin(l(x));
int R=dismin(r(x));
if(L<R)
{
if(L<ans&&l(x))ask_min(l(x));
if(R<ans&&r(x))ask_min(r(x));
}
else
{
if(R<ans&&r(x))ask_min(r(x));
if(L<ans&&l(x))ask_min(l(x));
}
}
inline int dismax(int x)
{
int cnt=0;
rep(0,K-1,i)cnt+=max(abs(q[i]-t[x].mn[i]),abs(q[i]-t[x].mx[i]));
return cnt;
}
inline void ask_max(int x)
{
ans=max(ans,dis(x));
int L=dismax(l(x));
int R=dismax(r(x));
if(L>R)
{
if(L>ans&&l(x))ask_max(l(x));
if(R>ans&&r(x))ask_max(r(x));
}
else
{
if(R>ans&&r(x))ask_max(r(x));
if(L>ans&&l(x))ask_max(l(x));
}
}
int main()
{
freopen("1.in","r",stdin);
get(n);cnt=n;
rep(1,n,i)
{
int get(x);int get(y);
t[i].d[0]=x;t[i].d[1]=y;
q[i]=i;
}
root=build(1,n,0);
get(Q);
rep(1,Q,i)
{
int op;
get(op);get(q[0]);get(q[1]);
if(op==0)insert(root,0,0);
if(op==1)
{
ans=INF;
ask_min(root);
put(ans);
}
if(op==2)
{
ans=-INF;
ask_max(root);
put(ans);
}
}
return 0;
}

luogu P6224 [BJWC2014]数据 KD-tree 标准板子 重构+二维平面内最近最远距离查询的更多相关文章

  1. K-D TREE算法原理及实现

    博客转载自:https://leileiluoluo.com/posts/kdtree-algorithm-and-implementation.html k-d tree即k-dimensional ...

  2. BZOJ4520:[CQOI2016]K远点对(K-D Tree)

    Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 N 行,每行两个整数 X,Y,表示一个点 的坐标 ...

  3. k-d tree算法

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

  4. BZOJ1941:[SDOI2010]Hide and Seek(K-D Tree)

    Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏- ...

  5. [转载]kd tree

    [本文转自]http://www.cnblogs.com/eyeszjwang/articles/2429382.html k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据 ...

  6. 【数据结构与算法】k-d tree算法

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

  7. 【数据结构】K-D Tree

    K-D Tree 这东西是我入坑 ICPC 不久就听说过的数据结构,但是一直没去学 QAQ,终于在昨天去学了它.还是挺好理解的,而且也有用武之地. 目录 简介 建树过程 性质 操作 例题 简介 K-D ...

  8. k-d tree 学习笔记

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

  9. [luogu P2633] Count on a tree

    [luogu P2633] Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点 ...

随机推荐

  1. (五)ELK Logstash output

    # 输出插件将数据发送到一个特定的目的地, 除了elasticsearch还有好多可输出的地方, 例如file, csv, mongodb, redis, syslog等 output { if [t ...

  2. BZOJ1854 连续攻击游戏 题解

    题目 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备最多 ...

  3. H3c实验室-(OSPF,Nat,STP,Dhcp,Acl)v.1)

    实验声明 本实验纯属学习记录性质,如有错误,请大哥帮忙提出,马上改正谢谢~还有学习H3c心态要好,他有超级多的bug!!!! 实验介绍 实验条件 实验开始 把图设计好 先说明一下RTA-RTB的线路是 ...

  4. [设计模式]面向对象五大设计原则:SOLID

    SOLID (面向对象设计) 单一功能原则(Single responsibility principle) 每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来 所有它的(这个类的)服务 ...

  5. JVM中栈的frames详解

    目录 简介 JVM中的栈 Frame Local Variables本地变量 Operand Stacks Dynamic Linking动态链接 方法执行完毕 简介 我们知道JVM运行时数据区域专门 ...

  6. NW.js Mac App 签名公证流程

    使用 Developer ID 为 Mac 软件签名 - Apple Developer 在MacOS 10.15之前,应用如果没有签名(signature),那么首次打开时就会弹出"无法验 ...

  7. JavaScript动画实例:动感小球

    已知圆的坐标方程为: X=R*SIN(θ) Y=R*COS(θ)     (0≤θ≤2π) 将0~2π区间等分48段,即设定间隔dig的值为π/24.θ初始值从0开始,按曲线方程求得坐标值(x,y), ...

  8. 《Head First 设计模式》:装饰者模式

    正文 一.定义 装饰者模式动态地将责任(功能)附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 要点: 装饰者和被装饰者有相同的超类型. 可以用一个或多个装饰者包装一个对象. 既然装 ...

  9. DEX文件解析--7、类及其类数据解析(完结篇)

    一.前言    前置技能链接:       DEX文件解析---1.dex文件头解析       DEX文件解析---2.Dex文件checksum(校验和)解析       DEX文件解析--3.d ...

  10. Burp Suite Scanner Module - 扫描模块

    Burp Suite Professional 和Enterprise Version的Scaner功能较丰富. 以Professional版本为例,包含Issue activity, Scan qu ...