hdoj 1556

解决:树状数组基础,插段求点 数据大小100000

/*本来是不打算写这个报告,就是一个基础的插段问点,但是ac之后,又搜了一个代码,让对树状数组有了一点新的认识,就从新改了一下,仍然是可以向后更新,向前求和,只是更新的时候,多更新的要减去,求点的时候向前累计,只有更新到的点才有值*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=100005;
int c[N];
int n;
int lowbit(int x)
{
    return x&(-x);
}
void update(int p,int inc)
{
    for(int i=p;i<=n;i+=lowbit(i))
    c[i]+=inc;
}
int get(int p)
{
    int res=0;
    for(int i=p;i>0;i-=lowbit(i))
     res+=c[i];
    return res; 
}
int main()
{
    int a,b;
    while(scanf("%d",&n),n)
    {
        memset(c,0,sizeof(c));
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a);
            scanf("%d",&b);
            update(a,1); 
            update(b+1,-1);
        }
        for(int i=1;i<n;i++)
          printf("%d ",get(i));
        printf("%d\n",get(n));
    }
    system("pause");
    return 0;
}

 

posted on 2011-09-25 13:08  猿类的进化史  阅读(412)  评论(1编辑  收藏  举报