码迷,mamicode.com
首页 > 编程语言 > 详细

Interval(南阳oj522)(树状数组)

时间:2014-11-17 22:51:54      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   ar   os   sp   for   div   

Interval

时间限制:2000 ms  |  内存限制:65535 KB
难度:4
描述
There are n(1 <= n <= 100000) intervals [ai, bi] and m(1 <= m <= 100000) queries, -100000 <= ai <= bi <= 100000 are integers.
Each query contains an integer xi(-100000 <= x <= 100000). For each query, you should answer how many intervals convers xi.
输入
The first line of input is the number of test case.
For each test case,
two integers n m on the first line, 
then n lines, each line contains two integers ai, bi;
then m lines, each line contains an integer xi.
输出
m lines, each line an integer, the number of intervals that covers xi.
样例输入
2
3 4
1 3
1 2
2 3
0
1
2
3
1 3
0 0
-1
0
1
样例输出
0
2
3
2
0
1
0
/*树状数组应用,统计数字在所给区间出现的次数。
TLE哭了,MAX大小:200002是AC,200005是TLE!!!
注意将负数转换到正值区间上,否则还是会TLE!!! 
*/
#include<stdio.h>
#include<string.h>
#define MAX 200002
int a[MAX];
int lowbit(int N)
{
	return N&(-N);
}
void asd(int i,int M)
{
	while(i<=MAX)
	{
		a[i]+=M;
		i+=lowbit(i);
	}
}
int sum(int j)
{
	int sum=0;
	while(j>0)
	{
		sum+=a[j];
		j-=lowbit(j);
	}
	return sum;
}
int main()
{
	int i,n,m,T,t,k,p;
	scanf("%d",&T);
	while(T--)
	{
		memset(a,0,sizeof(a));
		scanf("%d%d",&m,&n);
		while(m--)
		{
			scanf("%d%d",&k,&t);
			asd(k+100001,1);
			asd(t+100002,-1);
		}
		while(n--)
		{
			scanf("%d",&p);
			printf("%d\n",sum(p+100001));
		}
	}
	return 0;
}


Interval(南阳oj522)(树状数组)

标签:style   blog   io   color   ar   os   sp   for   div   

原文地址:http://blog.csdn.net/hdd871532887/article/details/41220747

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!