果枫-国峰

hdu 1556

View Code
#include<iostream>
using namespace std;

const int M=100000+9;

struct treenode
{
    int left;//左区间
    int right;//右区间
    int sum; //区间之和
}node[M*3];//节点数大约是最大区间的3被


void build(int low,int top,int index)//功能:建树
{
    node[index].left=low;
    node[index].right=top;
    node[index].sum=0;

    if(low==top)   //是否递归到最低层
    {

        return ;
    }

    int mid=(low+top)/2;

    build(low,mid,index*2);
    build(mid+1,top,index*2+1);

    return ;

}

void updata(int low,int top,int index)//在区间节点上加1
{
    int mid;
    if(low==node[index].left&&top==node[index].right)
    {
        node[index].sum++;
    }
    else
    {
        mid=(node[index].left+node[index].right)>>1;

        if(top<=mid)   //左子树
            updata(low,top,index*2);
        else
            if(low>mid)  //右子树
                updata(low,top,index*2+1);
            else  //左右都存在
            {
                updata(low,mid,index*2);
                updata(mid+1,top,index*2+1);
            }
    }
}

int search(int low,int top,int index,int sum)//sum的作用是在找最底层时经过的节点要加到最底层的node[].sum上
{
    if(node[index].left==low&&node[index].right==top)
        return node[index].sum+sum;
    int mid=(node[index].left+node[index].right)/2;
    if(top<=mid)
    {
        return search(low,top,index*2,sum+node[index].sum);
    }
    else
        return search(low,top,index*2+1,sum+node[index].sum);
}


int main()
{
    int t;
    while(cin>>t,t)
    {
        int i,j;
        memset(node,0,sizeof(node));
        build(1,t,1);
        int a,b;
        for(i=0;i<t;i++)
        {
            cin>>a>>b;
            updata(a,b,1);
        }
        for(i=1;i<t;i++)
            cout<<search(i,i,1,0)<<" ";
        cout<<search(t,t,1,0)<<endl;
    }
    return 0;
}
/*
3
1 1
2 2
3 3
3
1 1
1 2
1 3
*/

 

题意:中文题,此处省。

 

ac代码:

 

posted on 2012-09-10 15:41  果枫-国峰  阅读(133)  评论(0编辑  收藏  举报

导航