0
点赞
收藏
分享

微信扫一扫

hdoj Flowers 4325 (线段树)

您好 2023-04-20 阅读 25


Flowers


Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2580 Accepted Submission(s): 1266



Problem Description


As is known to all, the blooming time and duration varies between different kinds of flowers. Now there is a garden planted full of flowers. The gardener wants to know how many flowers will bloom in the garden in a specific time. But there are too many flowers in the garden, so he wants you to help him.




Input


The first line contains a single integer t (1 <= t <= 10), the number of test cases.
For each case, the first line contains two integer N and M, where N (1 <= N <= 10^5) is the number of flowers, and M (1 <= M <= 10^5) is the query times.
In the next N lines, each line contains two integer S i and T i (1 <= S i <= T i <= 10^9), means i-th flower will be blooming at time [S i, T i].
In the next M lines, each line contains an integer T i, means the time of i-th query.




Output


For each case, output the case number as shown and then print M lines. Each line contains an integer, meaning the number of blooming flowers.
Sample outputs are available for more details.




Sample Input


2
1 1
5 10
4
2 3
1 4
4 8
1
4
6




Sample Output


Case #1: 0 Case #2: 1 2 1



#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 100010
using namespace std;
struct zz
{
	int l;
	int r;
	int m;
}q[N<<2];
void build(int gen,int l,int r)
{
	q[gen].l=l;
	q[gen].r=r;
	q[gen].m=0;
	if(l==r)
		return ;
	int mid=(l+r)/2;
	build(gen<<1,l,mid);
	build(gen<<1|1,mid+1,r);
}
void update(int gen,int l,int r)
{
	if(q[gen].l==l&&q[gen].r==r)
	{
		q[gen].m++;
		return ;
	}
	int mid=(q[gen].l+q[gen].r)/2;
	if(r<=mid)
		update(gen<<1,l,r);
	else if(l>mid)
		update(gen<<1|1,l,r);
	else
	{
		update(gen<<1,l,mid);
		update(gen<<1|1,mid+1,r);
	}	
}
int query(int gen,int l,int r)
{
	if(q[gen].l==l&&q[gen].r==l)
		return q[gen].m;
	if(q[gen].l==q[gen].r)
		return 0;
	int mid=(q[gen].l+q[gen].r)/2;
	if(r<=mid)
		return query(gen<<1,l,r)+q[gen].m;
	else if(l>mid)
		return query(gen<<1|1,l,r)+q[gen].m;
	else
		return query(gen<<1,l,mid)+query(gen<<1|1,mid+1,r);
}
int main()
{
	int t,T=1;
	int n,m,z;
	int i,j,k;
	int x,y;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		build(1,1,N);
		while(n--)
		{
			scanf("%d%d",&x,&y);
			update(1,x,y);
		}
		printf("Case #%d:\n",T++);
		while(m--)
		{
			scanf("%d",&z);
			printf("%d\n",query(1,z,z));
		}
	}
	return 0;
}



举报

相关推荐

0 条评论