【HDU5126】 stars k-d树
题目大意:有$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树的更多相关文章
- HDU5126 stars【CDQ分治】*
HDU5126 stars Problem Description John loves to see the sky. A day has Q times. Each time John will ...
- 【BZOJ 1901】【Zju 2112】 Dynamic Rankings 动态K值 树状数组套主席树模板题
达神题解传送门:http://blog.csdn.net/dad3zz/article/details/50638360 说一下我对这个模板的理解: 看到这个方法很容易不知所措,因为动态K值需要套树状 ...
- 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))
函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...
- 【BZOJ】3196: Tyvj 1730 二逼平衡树(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3196 Treap+树状数组 1WA1A,好伤心,本来是可以直接1A的,这次开始我并没有看题解,就写出 ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...
- hdoj 1541 Stars【线段树单点更新+最大值维护】
Stars Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- Stars(BIT树状数组)
Stars Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- HDU 1541 Stars (线段树)
Problem Description Astronomers often examine star maps where stars are represented by points on ...
- Dynamic Rankings(动态第k大+树套树)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1112 题目: 思路: 树套树板子题. 代码实现如下: #inclu ...
随机推荐
- 『jQuery』.html(),.text()和.val()的使用
『jQuery』.html(),.text()和.val()的使用 2013-04-21 10:25 by 我是文东, 8335 阅读, 0 评论, 收藏, 编辑 本节内容主要介绍的是如何使用jQue ...
- 521. Longest Uncommon Subsequence I
static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...
- 2018.08.18 NOIP模拟 game(数位dp)
Game 题目背景 SOURCE:NOIP2015-SHY4 题目描述 Alice 和 Bob 正在玩一个游戏,两个人从 1 轮流开始报数,如果遇到 7 的倍数或者遇到的这个数的十进制表示中含 7 , ...
- Python 析构方法__del__
class Car: def __init__(self): print('---ok---') def __del__(self): print('----deconstrcut-------') ...
- IDEA SpringBoot Deprecated configuration property ‘server.servlet-path’
错误样式如图所示.说我这个版本中的这个标签是过时的. 解决: 出现这个问题后,这个标签被IDEA化成了黄线,同时,想使用server.servlet-path=*.html,配置servlet路径跳转 ...
- (博弈)Simple Game --codeforces--570B
链接: http://codeforces.com/problemset/problem/570/B http://acm.hust.edu.cn/vjudge/contest/view.action ...
- (二分匹配 模板 KM)奔小康赚大钱--hdu--2255
链接: http://acm.hdu.edu.cn/showproblem.php?pid=2255 代码: #include <iostream> #include <cstdio ...
- 用Lucene实现分组,facet功能,FieldCache
假如你像用lucene来作分组,比如按类别分组,这种功能,好了你压力大了,lucene本身是不支持分组的. 当你想要这个功能的时候,就可能会用到基于lucene的搜索引擎solr. 不过也可以通过编码 ...
- Java web 调试技巧之查看浏览器中调试中的network
在java web开发过程中尤其后台开发经常需要查看浏览器调试中的network项:今天在开发在线预览系统时用到了flexpaper插件,这个插件会调用FlexPaperViewer.swf这个软件( ...
- NotMapped属性特性
NotMapped特性可以应用到领域类的属性中,Code-First默认的约定,是为所有带有get,和set属性选择器的属性创建数据列.. NotManpped特性打破了这个约定,你可以使用NotMa ...