acdream1197 Points In Cuboid(hash树状数组)
题目链接:http://acdream.info/problem?pid=1197
题意:给出三维空间n个点,m个查询,每次查询某个立方体内的点的个数。
思路:按照一维排序,根据查询插入,其他两位用二位树状数组维护。由于这个坐标太大,二位数组开不出来。这时候就是hash,对于一个位置(x,y),哈希成一个数,作为下标。查询的时候不存在的数字为0.
const int mod=4000007; const int INF=1000000005; const int N=100005; const int M=20011; struct node { int x,y,z; }; node a[N],b[N][2]; int n,m; int ans[N]; pii Q[N]; int cmp(node a,node b) { return a.z<b.z; } int A[mod]; int arr[mod]; inline int ha(int x) { int k=x%mod; int i; for(i=k;;i++) { if(i==mod) i=0; if(A[i]) { if(A[i]==x) return i; } else { A[i]=x; return i; } } } inline int find(int x) { int k=x%mod; int i; for(i=k;;i++) { if(i==mod) i=0; if(A[i]) { if(A[i]==x) return i; } else { return i; } } return 0; } int que(int x,int y) { if(!x||!y) return 0; int ans=0; while(x) { int i; for(i=y;i;i-=i&-i) { ans+=arr[find(x*M+i)]; } x-=x&-x; } return ans; } void add(int x,int y) { while(x<M) { int i=y; while(i<M) arr[ha(x*M+i)]++,i+=i&-i; x+=x&-x; } } int cal(int t) { int ans=0; ans+=que(b[t][1].x,b[t][1].y); ans-=que(b[t][1].x,b[t][0].y-1); ans-=que(b[t][0].x-1,b[t][1].y); ans+=que(b[t][0].x-1,b[t][0].y-1); return ans; } void cal() { clr(A,0); clr(arr,0); int i; for(i=1;i<=n;i++) { scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z); a[i].x+=10005; a[i].y+=10005; } scanf("%d",&m); int j; for(i=1;i<=m;i++) { for(j=0;j<2;j++) { scanf("%d%d%d",&b[i][j].x,&b[i][j].y,&b[i][j].z); b[i][j].x+=10005; b[i][j].y+=10005; } if(b[i][0].x>b[i][1].x) swap(b[i][0].x,b[i][1].x); if(b[i][0].y>b[i][1].y) swap(b[i][0].y,b[i][1].y); if(b[i][0].z>b[i][1].z) swap(b[i][0].z,b[i][1].z); Q[i*2-1]=MP(b[i][0].z-1,-i); Q[i*2]=MP(b[i][1].z,i); } sort(a+1,a+n+1,cmp); sort(Q+1,Q+2*m+1); j=1; for(i=1;i<=m;i++) ans[i]=0; for(i=1;i<=n;i++) { while(j<=2*m&&Q[j].first<a[i].z) { int x=Q[j].second; if(x>0) ans[x]+=cal(x); else ans[-x]-=cal(-x); j++; } add(a[i].x,a[i].y); } while(j<=2*m) { int x=Q[j].second; if(x>0) ans[x]+=cal(x); else ans[-x]-=cal(-x); j++; } for(i=1;i<=m;i++) printf("%d\n",ans[i]); } int main() { int num=0; while(scanf("%d",&n)!=-1) { printf("Case #%d:\n",++num); cal(); } }
acdream1197 Points In Cuboid(hash树状数组)的更多相关文章
- [bzoj2124]等差子序列(hash+树状数组)
我又来更博啦 2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 941 Solved: 348[Submit][Statu ...
- URAL-1989 Subpalindromes 多项式Hash+树状数组
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1989 题意:给出一个字符串,m个操作:1,修改其中一个字符串,2,询问 [a, b] 是 ...
- P7114 [NOIP2020] 字符串匹配 (字符串hash+树状数组)
好多题解用的扩展KMP(没学过,所以不用这种方法). 我们按照题目要求记F(s)表示s串的权值,可以预处理出前缀权值(用于A)和后缀权值(用于C),枚举AB的长度i=2~n-1,不需要分开枚举,我们只 ...
- CF452F Permutations/Luogu2757 等差子序列 树状数组、Hash
传送门--Luogu 传送门--Codeforces 如果存在长度\(>3\)的等差子序列,那么一定存在长度\(=3\)的等差子序列,所以我们只需要找长度为\(3\)的等差子序列.可以枚举等差子 ...
- bzoj 2124 等差子序列 树状数组维护hash+回文串
等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 1919 Solved: 713[Submit][Status][Discuss] Desc ...
- 【BZOJ2124】等差子序列 树状数组维护hash值
[BZOJ2124]等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N ...
- ACdreamoj 1011(树状数组维护字符串hash前缀和)
题目链接:http://acdream.info/problem? pid=1019 题意:两种操作,第一种将字符串某个位置的字符换为还有一个字符.另外一种查询某个连续子序列是否是回文串: 解法:有两 ...
- bzoj 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛【dp+树状数组+hash】
最长上升子序列.虽然数据可以直接n方但是另写了个nlogn的 转移:f[i]=max(f[j]+1)(a[j]<a[i]) O(n^2) #include<iostream> #in ...
- ural 1989(树状数组+多项式hash)
题意:给出一个字符串.有两种操作,一个是p a b,问字符串从位置a到位置b的子串是否是一个回文子串.还有一个操作 c a b,把字符串位置a的字符替换为b. 题解:由于字符串长度为1e5且问的次数也 ...
随机推荐
- 夺命雷公狗ThinkPHP项目之----企业网站19之网站配置信息的修改
我们这个其实也是很简单的,思路是直接将提交过来的cf_id 改成我们自己定义好的 “1” 即可,因为1配置只能有一个,所以永久都是该id 为1的: 先来完成我们的控制器,代码如下所示: public ...
- ahb2apb和apb2apb async bridge
AHB 3.0目前不支持security world. AHB到APB的async bridge主要包括三个部分: 1)AHB domain 1)产生信号hactive = HSEL & HT ...
- java 与 R 相互调用
https://www.r-project.org/ http://cos.name/2013/08/r-rjava-java/ http://blog.csdn.net/hwssg/article/ ...
- bootstrap, boosting, bagging 几种方法的联系
http://blog.csdn.net/jlei_apple/article/details/8168856 这两天在看关于boosting算法时,看到一篇不错的文章讲bootstrap, jack ...
- PAT乙级 1013. 数素数 (20)
1013. 数素数 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 令Pi表示第i个素数.现任给两个正整 ...
- Oracle中的rownum用法解析
注意:rownum从1开始: 1.rownum按照记录插入时的顺序给记录排序,所以有order by的子句时一定要注意啊! 2.使用时rownum,order by字段是否为主键有什么影响? 3 ...
- 创建本地yum软件源,为本地Package安装Cloudera Manager、Cloudera Hadoop及Impala做准备
一.包管理工具及CentOS的yum 1.包管理工具如何发现可以用的包 包管理工具依赖一系列软件源,工具下载源的信息存储在配置文件中,其位置随某包管理工具不同而变化 使用yum的RedHat/Cent ...
- 一、Java基础--01
Java基础测试题分析 第一题是关于基本的算法知识,这个很有必要去掌握以下,在学校也经常听老师们说找工作比试面试会出一些这方面的知识,我拿到的第一题是关于排序的,虽然很简单,但是我还是要提醒一下基础不 ...
- SQLServer中在视图上使用索引(转载)
在SQL Server中,视图是一个保存的T-SQL查询.视图定义由SQL Server保存,以便它能够用作一个虚拟表来简化查询,并给基表增加另一层安全.但是,它并不占用数据库的任何空间.实际上,在你 ...
- 利用python进行数据分析 (学习笔记)
第一章:准备工作 1.重要的Python库 (1)NumPy:Python科学计算的基础包.功能有: