HDU 1556 Color the ball 线段树

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1556


基本线段树。


代码如下:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
using namespace std;

/*
freopen("input.txt",  "r", stdin);
freopen("output.txt", "w", stdout);
*/

using namespace std;
const int N=100005;
int xh[N<<2];
struct node
{
    int l,r;
    int cnt;
}p[N<<2];

void build(int l,int r,int u)//构造线段树
{
    p[u].l=l;
    p[u].r=r;
    p[u].cnt=0;
    if(l==r)
    {
        xh[l]=u;
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,u<<1);
    build(mid+1,r,u<<1|1);
}

void update(int l,int r,int u)//更新线段树
{
    if(l==p[u].l&&r==p[u].r)
    {
        p[u].cnt++;
        return;
    }
    int mid=(p[u].l+p[u].r)>>1;
    if(r<=mid)
        update(l,r,u<<1);
    else if(l>mid)
        update(l,r,u<<1|1);
    else
    {
        update(l,mid,u<<1);
        update(mid+1,r,u<<1|1);
    }
}

void find(int u,int lu)//查询线段树
{
    int mid=(p[u].l+p[u].r)>>1;
        p[u].cnt+=p[lu].cnt;
    if(p[u].l==p[u].r)
        return ;
    find(u<<1,u);
    find(u<<1|1,u);
}

int main()
{
    int n,a,b;
    while(scanf("%d",&n),n)
    {
        build(1,n,1);
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&a,&b);
            update(a,b,1);
        }
        p[0].cnt=0;
        find(1,0);
        for(int i=1;i<n;i++)
            printf("%d ",p[xh[i]].cnt);
        printf("%d\n",p[xh[n]].cnt);
    }
    return 520;
}


你可能感兴趣的:(HDU 1556 Color the ball 线段树)