Problem F
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 332 Accepted Submission(s): 143
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.
SampleInput
2
1 1
5 10
4
2 3
1 4
4 8
1
4
6
SampleOutput
Case #1:
0
Case #2:
1
2
1
//水水噢
//区间覆盖问题,求某个区间被覆盖几次
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 100000
#define lson l,m,k<<1
#define rson m+1,r,k<<1|1
using namespace std;
int st[N<<2];
void build(int l,int r,int k)
{
st[k]=0;
if(l==r)
return;
int m=(l+r)>>1;
build(lson);
build(rson);
}
void update(int &L,int &R,int l,int r,int k)
{
if(L<=l&&R>=r)
{
st[k]+=1;
return ;
}
int m=(l+r)>>1;
if(L<=m) update(L,R,lson);
if(R>m) update(L,R,rson);
}
void query(int &i,int l,int r,int k)
{
if(l==r)
{
printf("%d\n",st[k]);
return;
}
if(st[k])
{
st[k<<1]+=st[k];
st[k<<1|1]+=st[k];
st[k]=0;
}
int m=(l+r)>>1;
if(i<=m) query(i,lson);
else query(i,rson);
}
int main()
{
int T,t=1;
int i,n,m;
int s,e;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
build(1,N,1);
printf("Case #%d:\n",t++);
for(i=1;i<=n;i++)
{
scanf("%d%d",&s,&e);
update(s,e,1,N,1);
}
while(m--)
{
scanf("%d",&s);
query(s,1,N,1);
}
}
return 0;
}