http://acm.hdu.edu.cn/showproblem.php?pid=4325

 

Flowers

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


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
 

 

Author
BJTU
 

 

Source

 

 

 

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
using namespace std;

#define N 110000
#define MOD 100000007
#define Lson r<<1
#define Rson r<<1|1

struct node
{
    int L, R, e;
    int Mid()
    {
        return (L+R)/2;
    }
}a[N<<2];

void BuildTree(int r, int L, int R)
{
    a[r].L=L, a[r].R=R, a[r].e=0;

    if(L==R)
        return ;

    BuildTree(Lson, L, a[r].Mid());
    BuildTree(Rson, a[r].Mid()+1, R);
}

void Update(int r, int L, int R)
{
    if(a[r].L==L && a[r].R==R)
    {
        a[r].e++;
        return ;
    }

    if(R<=a[r].Mid())
        return Update(Lson, L, R);
    else if(L>a[r].Mid())
        return Update(Rson, L, R);
    else
    {
        Update(Lson, L, a[r].Mid());
        Update(Rson, a[r].Mid()+1, R);
    }
}

void UP(int r, int L, int R)
{
    if(L==R)
        return ;

    if(a[r].L==L && a[r].R==R )
    {
        a[Lson].e += a[r].e;
        a[Rson].e += a[r].e;
    }

    if(R<=a[r].Mid())
         UP(Lson, L, R);
    else if(L>a[r].Mid())
         UP(Rson, L, R);
    else
    {
         UP(Lson, L, a[r].Mid());
         UP(Rson, a[r].Mid()+1, R);
    }
}

int Query(int r, int x)
{
    if(a[r].L==a[r].R && a[r].L==x)
       return a[r].e;

    if(x<=a[r].Mid())
        return Query(Lson, x);
    else
        return Query(Rson, x);
}

int main()
{
    int T, iCase=1;
    scanf("%d", &T);
    while(T--)
    {
        int n, m, i, L, R, x;

        scanf("%d%d", &n, &m);

        BuildTree(1, 1, 100005);

        for(i=0; i<n; i++)
        {
            scanf("%d%d", &L, &R);
            Update(1, L, R);
        }

        UP(1, 1, 100005);

        printf("Case #%d:\n", iCase++);
        for(i=0; i<m; i++)
        {
            scanf("%d", &x);
            printf("%d\n", Query(1, x));
        }
    }
    return 0;
}

 

posted on 2015-11-14 20:43  栀蓝  阅读(270)  评论(0编辑  收藏  举报

levels of contents