题目大意:有$m$个操作,分两种:在指定三维坐标内加入一个点,询问指定空间内点的数量。

其中$m≤5*10^{4},1≤x,y,z≤10^9$

这题几乎就是裸的$k-d$树啊。我们动态维护一棵$k-d$树,对于以某个节点为根的字树中,维护该子树中点的三维范围,以及该子树中点的数量。然后直接查询即可。

PS:为了保证你的程序不会变成“优秀”的$n^{2}$做法,需要写一个类似虚树暴力重构的东西,去控制该树的平衡。

#include<bits/stdc++.h>
#define M 100000
using namespace std;
struct node{
int a[],max[],min[],sum,l,r,d;
node(){
a[]=a[]=a[]=; max[]=max[]=max[]=;
min[]=min[]=min[]=; sum=d=l=r=;
}
node(int x,int y,int z){
a[]=x; a[]=y; a[]=z; sum=l=d=r=;
max[]=max[]=max[]=; min[]=min[]=min[]=;
}
node(int x1,int y1,int z1,int x2,int y2,int z2){
max[]=x2; max[]=y2; max[]=z2;
min[]=x1; min[]=y1; min[]=z1;
a[]=a[]=a[]=sum=l=r=d=;
}
}a[M]; int root=,use=;
int id[M]={},rebid=,rebfa=,now=;
void add(int &x,int fa,int d,node k){
if(!x) x=++use,a[x]=k,a[x].d=d;
else{
if(k.a[d]<a[x].a[d]) add(a[x].l,x,(d+)%,k);
else add(a[x].r,x,(d+)%,k);
}
a[x].max[]=max(a[x].max[],k.a[]); a[x].min[]=min(a[x].min[],k.a[]);
a[x].max[]=max(a[x].max[],k.a[]); a[x].min[]=min(a[x].min[],k.a[]);
a[x].max[]=max(a[x].max[],k.a[]); a[x].min[]=min(a[x].min[],k.a[]);
a[x].sum++;
if(max(a[a[x].l].sum,a[a[x].r].sum)>a[x].sum*0.7) rebid=x,rebfa=fa;
}
int D;
bool cmp(int x,int y){
return a[x].a[D]<a[y].a[D];
}
void bl(int x){
if(!x) return; id[++now]=x;
bl(a[x].l); bl(a[x].r);
a[x].max[]=a[x].max[]=a[x].max[]=a[x].l=a[x].r=a[x].sum=a[x].d=;
a[x].min[]=a[x].min[]=a[x].min[]=;
}
void rebuild(int &x,int l,int r,int d){
if(l>r) return; int mid=(l+r)>>; D=d;
nth_element(id+l,id+mid,id+r+,cmp); x=id[mid];
rebuild(a[x].l,l,mid-,(d+)%); rebuild(a[x].r,mid+,r,(d+)%);
for(int i=;i<;i++)
a[x].max[i]=max(a[x].a[i],max(a[a[x].l].max[i],a[a[x].r].max[i])),
a[x].min[i]=min(a[x].a[i],min(a[a[x].l].min[i],a[a[x].r].min[i]));
a[x].sum=a[a[x].l].sum+a[a[x].r].sum+; a[x].d=d;
}
void rebuild(){
if(!rebid) return;
bl(rebid);
if(rebfa==) {rebuild(root,,now,a[rebid].d);}
else{
if(a[rebfa].l==rebid) rebuild(a[rebfa].l,,now,a[rebid].d);
else rebuild(a[rebfa].r,,now,a[rebid].d);
}
rebid=rebfa=now=;
}
int query(int x,node k){
int ck=,sum=; if(!x) return ;
for(int i=;i<;i++) if(k.min[i]<=a[x].min[i]&&a[x].max[i]<=k.max[i]) ck++; if(ck==) return a[x].sum;
for(int i=;i<;i++) if(k.max[i]<a[x].min[i]||a[x].max[i]<k.min[i]) return ; ck=;
for(int i=;i<;i++) if(k.min[i]<=a[x].a[i]&&a[x].a[i]<=k.max[i]) ck++; if(ck==) sum++;
return sum+query(a[x].l,k)+query(a[x].r,k);
}
int main(){
int n; scanf("%d",&n);
while(n--){
int op,x,y,z,x1,y1,z1; scanf("%d%d%d%d",&op,&x,&y,&z);
if(op==) add(root,,,node(x,y,z)),rebuild();
else scanf("%d%d%d",&x1,&y1,&z1),printf("%d\n",query(root,node(x,y,z,x1,y1,z1)));
}
}

【HDU5126】 stars k-d树的更多相关文章

  1. HDU5126 stars【CDQ分治】*

    HDU5126 stars Problem Description John loves to see the sky. A day has Q times. Each time John will ...

  2. 【BZOJ 1901】【Zju 2112】 Dynamic Rankings 动态K值 树状数组套主席树模板题

    达神题解传送门:http://blog.csdn.net/dad3zz/article/details/50638360 说一下我对这个模板的理解: 看到这个方法很容易不知所措,因为动态K值需要套树状 ...

  3. 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))

    函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...

  4. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...

  5. 【BZOJ】3196: Tyvj 1730 二逼平衡树(区间第k小+树套树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3196 Treap+树状数组 1WA1A,好伤心,本来是可以直接1A的,这次开始我并没有看题解,就写出 ...

  6. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...

  7. hdoj 1541 Stars【线段树单点更新+最大值维护】

    Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  8. Stars(BIT树状数组)

    Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  9. HDU 1541 Stars (线段树)

     Problem Description Astronomers often examine star maps where stars are represented by points on ...

  10. Dynamic Rankings(动态第k大+树套树)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1112 题目: 思路: 树套树板子题. 代码实现如下: #inclu ...

随机推荐

  1. 【Maven】Nexus(Maven仓库私服)下载与安装

    Nexus介绍 Nexus 是Maven仓库管理器,如果你使用Maven,你可以从Maven中央仓库 下载所需要的构件(artifact),但这通常不是一个好的做法,你应该在本地架设一个Maven仓库 ...

  2. Devexpress VCL Build v2014 vol 14.2.7发布

    2015年马上快过去一半了,这个玩意还在纠结在14版.其实也无所谓,反正就是改成15版,也还是这些 东西的修补. What's New in 14.2.7 (VCL Product Line)   N ...

  3. Robot Perception for Indoor Navigation《室内导航中的机器人感知》

    Felix Endres 论文下载 Technische Fakult¨ atAlbert-Ludwigs-Universit¨ at Freiburg Betreuer: Prof. Dr. Wol ...

  4. git push/pull时总需要输入用户名密码的解决方案

    在提交项目代码或者拉代码的时候,git会让你输入用户名密码,解决方案:(我们公司用的是gitlab) 执行git config --global credential.helper store命令 然 ...

  5. 《Android开发艺术探索》第11章 Android的线程和线程池

    第11章 Android的线程和线程池 11.1 主线程和子线程 (1)在Java中默认情况下一个进程只有一个线程,也就是主线程,其他线程都是子线程,也叫工作线程.Android中的主线程主要处理和界 ...

  6. java web中如何获取spring容器中定义的bean----WebApplicationContext的使用

    本文简单编写一个servlet来获取spring容器中管理的<bean  id="dateBean" class="java.util.Date" sin ...

  7. UniGUI的TUniLoginForm窗口自定义背景色

    uniGUI的TUniLoginForm类创建的登录窗口默认是不带颜色,可以自定义css风格来改变背景颜色. 一般是通过在UniServerModule中,在CustcomSS属性中,修改extjs的 ...

  8. Eclipse ADT 代码注释模版

    具体怎么用: 将下面的内容拷贝出来保存为XML文件,进入,Eclipse :Window --> Java --> Code Style --> Code Templates-> ...

  9. sklearn使用小记GridSearchCV

    def test_grid_search(): from sklearn import datasets,svm iris = datasets.load_iris() parameters = {' ...

  10. C# 获取每一个像素点的RGB

    int x, y; x = e.X; y = e.Y; Color pixel = MyImage.GetPixel(x, y); byte R = pixel.R; byte G = pixel.G ...