HDU 4325 Flowers

  线段树的离散化和成段增减和单点查询。开始的时候二分函数写得有点问题,一直在WA,

然后修改下就过了。离散化时将所有的时间点都加入到一个X数组中,经过判重后X的元素

有k个,我们就可以建立一个k个元素的线段树。查询和修改时只需找到时间点在X数组中

的位置,然后就和普通线段树没有任何区别了,这题不需要从叶子向根节点更新,只需从

根到叶子节点更新。

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<algorithm>

using namespace std;



#define lson l, m, rt << 1

#define rson m + 1, r, rt << 1 | 1



const int MAXN = 100100;

int col[MAXN << 2], sum[MAXN << 2], q[MAXN];

int X[MAXN << 2], si[MAXN], ti[MAXN];

int n, mm, e, k;

/*

void PushUp(int rt)

{

    sum[rt] = max(sum[rt << 1], sum[rt << 1 | 1]);

}

*/



void PushDown(int rt)

{

    if(col[rt])

    {

        col[rt << 1] += col[rt];

        col[rt << 1 | 1] += col[rt];

        sum[rt << 1] += col[rt];

        sum[rt << 1 | 1] += col[rt];

        col[rt] = 0;

    }

}



void build(int l, int r, int rt)

{

    int m = l + r >> 1;

    sum[rt] = 0;

    col[rt] = 0;

    if(l == r)

    {

        return;

    }

    build(lson);

    build(rson);

    //PushUp(rt);

}



void update(int L, int R, int l, int r, int rt)

{

    int m = l + r >> 1;

    if(L <= l && r <= R)

    {

        col[rt] ++;

        sum[rt] ++;

        return;

    }

    PushDown(rt);

    if(L <= m) update(L, R, lson);

    if(R > m) update(L, R, rson);

    //PushUp(rt);

}



int query(int L, int R, int l, int r, int rt)

{

    int m = l + r >> 1, ret = 0;

    if(L <= l && r <= R)

    {

        return sum[rt];

    }

    PushDown(rt);

    if(L <= m) return query(L, R, lson);

    if(R > m) return query(L, R, rson);

}



int BS(int key, int n, int X[])

{

    int l = 0, r = n - 1;

    while(l <= r)

    {

        int m = l + r >> 1;

        if(key == X[m]) return m;

        if(key < X[m]) r = m - 1;

        else l = m + 1;

    }

    return l;

}



void init()

{

    int i, j;

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

    e = 0;

    for(i = 0; i < n; i ++)

    {

        scanf("%d%d", &si[i], &ti[i]);

        X[e ++] = si[i];

        X[e ++] = ti[i];

    }



    for(i = 0; i < mm; i ++)

    {

        scanf("%d", &q[i]);

        X[e ++] = q[i];

    }



    sort(X, X + e);



    k = 1;

    for(i = 1; i < e; i ++)

    {

        if(X[i] != X[i - 1])

            X[k ++] = X[i];

    }

}



int main()

{

    int T, cas, i;

    scanf("%d", &T);

    for(cas = 1; cas <= T; cas ++)

    {

        init();

        build(0, k, 1);

        for(i = 0; i < n; i ++)

        {

            int L = BS(si[i], k, X);

            int R = BS(ti[i], k, X);

            update(L, R, 0, k, 1);

        }



        printf("Case #%d:\n", cas);

        for(i = 0; i < mm; i ++)

        {

            int p = BS(q[i], k, X);

            printf("%d\n", query(p, p, 0, k, 1));

        }



    }

    return 0;

}

 

 

你可能感兴趣的:(HDU)