码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2352 && HDU 1541 Stars (树状数组)

时间:2014-08-26 00:29:55      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:poj 2352   hdu 1541   stars   树状数组   astronomers often ex   

一开始想,总感觉是DP,可是最后什么都没想到。还暴力的交了一发。

然后开始写线段树,结果超时。感觉自己线段树的写法有问题。改天再写。先把树状数组的写法贴出来吧。

~~~~~~~~~~~~~~~~~~~~~~~~

树状数组不懂的去看刘汝佳的大白书,那个图画得很清楚。

题目大意:星星的坐标以y递增的顺序给出,这些点的左下方的点数代表这个点的级数,问0~N-1的级数有多少个?其实y根本木有用。

题目链接:http://poj.org/problem?id=2352

http://acm.hdu.edu.cn/showproblem.php?pid=1541

树状数组的思路在于:每一次询问,就相当于询问在1~x(包括x)间有多少个点。那么我们边读入,边更新就好。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 32000+10
using namespace std;

int a[N],ans[N>>1];
int lowbit(int x)
{
    return x&(-x);
}
int Sum(int x)
{
    int tot=0;
    while(x>0)
    {
        tot+=a[x];
        x-=lowbit(x);
    }
    return tot;
}
void update(int x,int v)
{
    while(x<=N)
    {
        a[x]+=v;
        x+=lowbit(x);
    }
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int x,y;
        memset(a,0,sizeof(a));
        memset(ans,0,sizeof(ans));
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&x,&y);
            x++;    //1~x的区间。
            ans[ Sum(x) ]++;
            update(x,1);  //用1来更新。
        }
        for(int i=0;i<n;i++)
            printf("%d\n",ans[i]);
    }
    return 0;
}






POJ 2352 && HDU 1541 Stars (树状数组)

标签:poj 2352   hdu 1541   stars   树状数组   astronomers often ex   

原文地址:http://blog.csdn.net/darwin_/article/details/38833369

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!