IT民工
加油!

  线段树的离散化和成段增减和单点查询。开始的时候二分函数写得有点问题,一直在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;
}

 

 

posted on 2012-08-09 16:10  找回失去的  阅读(435)  评论(0编辑  收藏  举报