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 Si and Ti (1 <= Si <= Ti <= 10^9), means i-th flower will be blooming at time [Si, Ti].
In the next M lines, each line contains an integer Ti, 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
/** 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; }