http://acm.hdu.edu.cn/showproblem.php?pid=4325
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.
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 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
/**
hdu 4325 树状数组+离散化
题目大意:给定n朵花,每朵花开放的时间段,然后m个询问:ti时间点有多少花正在盛开
解题思路:树状数组裸体,不过要离散化花开放的时间
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=300005;
int n,m,k;
int C[maxn],a[maxn];
struct note
{
int x,id;
bool operator <(const note &other)const
{
return x<other.x;
}
}p[maxn];
int lowbit(int i)
{
return i&(-i);
}
int sum(int x)
{
int cnt=0;
while(x>0)
{
cnt+=C[x];
x-=lowbit(x);
}
return cnt;
}
void update(int pos,int value)
{
while(pos<=k)
{
C[pos]+=value;
pos+=lowbit(pos);
}
}
int main()
{
int T,tt=0;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
int nn=n*2;
int mm=nn+m;
for(int i=0;i<mm;i++)
{
scanf("%d",&p[i].x);
p[i].id=i;
}
sort(p,p+mm);
k=1;
a[p[0].id]=k;
for(int i=1;i<mm;i++)
{
if(p[i].x==p[i-1].x)
{
a[p[i].id]=k;
}
else
a[p[i].id]=++k;
}
memset(C,0,sizeof(C));
for(int i=0;i<nn-1;i+=2)
{
update(a[i],1);
update(a[i+1]+1,-1);
}
printf("Case #%d:\n",++tt);
for(int i=nn;i<mm;i++)
{
printf("%d\n",sum(a[i]));
}
}
return 0;
}