luogu P6224 [BJWC2014]数据 KD-tree 标准板子 重构+二维平面内最近最远距离查询
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 标准板子 重构+二维平面内最近最远距离查询的更多相关文章
- K-D TREE算法原理及实现
博客转载自:https://leileiluoluo.com/posts/kdtree-algorithm-and-implementation.html k-d tree即k-dimensional ...
- BZOJ4520:[CQOI2016]K远点对(K-D Tree)
Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 N 行,每行两个整数 X,Y,表示一个点 的坐标 ...
- k-d tree算法
k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点匹配的时候就会利用到k ...
- BZOJ1941:[SDOI2010]Hide and Seek(K-D Tree)
Description 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他决定和他的好朋友giPi(鸡皮)玩一个更加寂寞的游戏- ...
- [转载]kd tree
[本文转自]http://www.cnblogs.com/eyeszjwang/articles/2429382.html k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据 ...
- 【数据结构与算法】k-d tree算法
k-d tree算法 k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点 ...
- 【数据结构】K-D Tree
K-D Tree 这东西是我入坑 ICPC 不久就听说过的数据结构,但是一直没去学 QAQ,终于在昨天去学了它.还是挺好理解的,而且也有用武之地. 目录 简介 建树过程 性质 操作 例题 简介 K-D ...
- k-d tree 学习笔记
以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...
- [luogu P2633] Count on a tree
[luogu P2633] Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点 ...
随机推荐
- (五)ELK Logstash output
# 输出插件将数据发送到一个特定的目的地, 除了elasticsearch还有好多可输出的地方, 例如file, csv, mongodb, redis, syslog等 output { if [t ...
- BZOJ1854 连续攻击游戏 题解
题目 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备最多 ...
- H3c实验室-(OSPF,Nat,STP,Dhcp,Acl)v.1)
实验声明 本实验纯属学习记录性质,如有错误,请大哥帮忙提出,马上改正谢谢~还有学习H3c心态要好,他有超级多的bug!!!! 实验介绍 实验条件 实验开始 把图设计好 先说明一下RTA-RTB的线路是 ...
- [设计模式]面向对象五大设计原则:SOLID
SOLID (面向对象设计) 单一功能原则(Single responsibility principle) 每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来 所有它的(这个类的)服务 ...
- JVM中栈的frames详解
目录 简介 JVM中的栈 Frame Local Variables本地变量 Operand Stacks Dynamic Linking动态链接 方法执行完毕 简介 我们知道JVM运行时数据区域专门 ...
- NW.js Mac App 签名公证流程
使用 Developer ID 为 Mac 软件签名 - Apple Developer 在MacOS 10.15之前,应用如果没有签名(signature),那么首次打开时就会弹出"无法验 ...
- JavaScript动画实例:动感小球
已知圆的坐标方程为: X=R*SIN(θ) Y=R*COS(θ) (0≤θ≤2π) 将0~2π区间等分48段,即设定间隔dig的值为π/24.θ初始值从0开始,按曲线方程求得坐标值(x,y), ...
- 《Head First 设计模式》:装饰者模式
正文 一.定义 装饰者模式动态地将责任(功能)附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 要点: 装饰者和被装饰者有相同的超类型. 可以用一个或多个装饰者包装一个对象. 既然装 ...
- DEX文件解析--7、类及其类数据解析(完结篇)
一.前言 前置技能链接: DEX文件解析---1.dex文件头解析 DEX文件解析---2.Dex文件checksum(校验和)解析 DEX文件解析--3.d ...
- Burp Suite Scanner Module - 扫描模块
Burp Suite Professional 和Enterprise Version的Scaner功能较丰富. 以Professional版本为例,包含Issue activity, Scan qu ...