hud 1556 线段树

来源:互联网 发布:电商美工工资待遇 编辑:程序博客网 时间:2024/04/26 09:15
//hdu1556#include <stdio.h>#include <string.h>/*利用线段树解决每次更新区间的值,计算结果时加入到子区间*/int bTree[100000*3+10];int n, k;//begin-end表示node节点所代表的区间,from-to代表目标区间//将结果存在父节点中输出时将父节点的值加到子节点中void update(int begin, int end, int from, int to, int node){    if(begin==from && end==to)    {        bTree[node] ++;        return;    }    int mid = (begin+end)/2;    if(from > mid)        update(mid+1, end, from, to, node*2+1);    else if(to <= mid)        update(begin, mid, from, to, node*2);    else    {        update(begin, mid, from, mid, node*2);        update(mid+1, end, mid+1, to, node*2+1);    }}//即树的遍历,输出叶子节点的值void show(int begin, int end, int val, int node){    if(begin == end)    {        if(++k!=n) printf("%d ", bTree[node]+val);        else printf("%d", bTree[node]+val);        return;    }    show(begin, (begin+end)/2, val+bTree[node], node*2);    show((begin+end)/2+1, end, val+bTree[node], node*2+1);}int main(){    while(scanf("%d", &n) && n)    {        int a, b;        k=0;        memset(bTree, 0, sizeof(bTree));        for(int i=0; i<n; i++)        {            scanf("%d %d", &a, &b);            update(1, n, a, b, 1);        }        show(1, n, 0, 1);        printf("\n");    }    return 0;}

0 0