题目链接: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树状数组)的更多相关文章

  1. [bzoj2124]等差子序列(hash+树状数组)

    我又来更博啦     2124: 等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 941  Solved: 348[Submit][Statu ...

  2. URAL-1989 Subpalindromes 多项式Hash+树状数组

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1989 题意:给出一个字符串,m个操作:1,修改其中一个字符串,2,询问 [a, b] 是 ...

  3. P7114 [NOIP2020] 字符串匹配 (字符串hash+树状数组)

    好多题解用的扩展KMP(没学过,所以不用这种方法). 我们按照题目要求记F(s)表示s串的权值,可以预处理出前缀权值(用于A)和后缀权值(用于C),枚举AB的长度i=2~n-1,不需要分开枚举,我们只 ...

  4. CF452F Permutations/Luogu2757 等差子序列 树状数组、Hash

    传送门--Luogu 传送门--Codeforces 如果存在长度\(>3\)的等差子序列,那么一定存在长度\(=3\)的等差子序列,所以我们只需要找长度为\(3\)的等差子序列.可以枚举等差子 ...

  5. bzoj 2124 等差子序列 树状数组维护hash+回文串

    等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 1919  Solved: 713[Submit][Status][Discuss] Desc ...

  6. 【BZOJ2124】等差子序列 树状数组维护hash值

    [BZOJ2124]等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N ...

  7. ACdreamoj 1011(树状数组维护字符串hash前缀和)

    题目链接:http://acdream.info/problem? pid=1019 题意:两种操作,第一种将字符串某个位置的字符换为还有一个字符.另外一种查询某个连续子序列是否是回文串: 解法:有两 ...

  8. 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 ...

  9. ural 1989(树状数组+多项式hash)

    题意:给出一个字符串.有两种操作,一个是p a b,问字符串从位置a到位置b的子串是否是一个回文子串.还有一个操作 c a b,把字符串位置a的字符替换为b. 题解:由于字符串长度为1e5且问的次数也 ...

随机推荐

  1. java-excel导出

    java excel导出分为两种2003年的格式和2007年的格式. 2003年的xls一个sheet限制65536. 2007年的xlsx限制为1048576. jxl导入2003 gradle j ...

  2. RMAN基础知识补充

    一.FORMAT字符串替代变量 使用FORMAT参数时可使用的各种替换变量,如下: %c :备份片的拷贝数(从1开始编号): %d :数据库名称: %D :位于该月中的天数 (DD): %M :位于该 ...

  3. JSP-08-第三方控件的使用

    添加图片 下载 commons-fileupload-1.2.2.jar和commons-io-2.4.jar 导入项目 在添加涂抹的页面设置表单属性  enctype=”multipart/form ...

  4. [OrangePi] Installation on internal EMMC

    Install the image on SD Card as described above Boot your Orange PI board from SD Card Run: sudo ins ...

  5. C++笔试题(部分)

    1.简述C++11和Boost 2.struct和union与class的区别 3.为什么C++中调用被C编译器编译后的函数要加extern C声明? 4.以下代码哪里不对? #pragma regi ...

  6. linux常用命令简单介绍(netstat,awk,top,tail,head,less,more,cat,nl)

    1.netstat netstat -tnl | grep 443 (查看443端口是否被占用) root用户,用netstat -pnl | grep 443 (还可显示出占用本机443端口的进程P ...

  7. 在Dll中使用 TFDQuery 的 LoadFromStream 方法注意问题

    今天又遇到一怪事,  FDQuery 在服务器 savestream 传回了客户端. 客户端接收后 loadfromstream 接收都正常.  但当我把客户端封装成 dll 时,loadfromst ...

  8. String.Join 和 Distinct 方法 去除字符串中重复字符

    Qualys项目中写到将ServerIP以“,”分割后插入数据库并将重复的IP去除后发送到服务器进行Scan,于是我写了下面的一段用来剔除重复IP: //CR#1796870 modify by v- ...

  9. PHP gmdate() 函数

    定义和用法 gmdate() 函数格式化 GMT/UTC 日期/时间. 同 date() 函数 类似,不同的是返回的时间是格林威治标准时(GMT). 语法 gmdate(format,timestam ...

  10. discuz阅读权限的设置作用

    为什么要有阅读权限?偶想很多新手有这个疑问吧,所以特开此帖说明下. 阅读权限的设置是帖子作者为了部分限制帖子的读者群.虽然网上发帖重在分享,但帖子(尤其精华帖子)是作者花时间和经历而写成的,不加阅读权 ...