码迷,mamicode.com
首页 > 编程语言 > 详细

POJ 2352 【树状数组】

时间:2015-11-14 23:23:07      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:

题意:

给了很多星星的坐标,星星的特征值是不比他自己本身高而且不在它右边的星星数。

给定的输入数据是按照y升序排序的,y相同的情况下按照x排列,x和y都是介于0和32000之间的整数。每个坐标最多有一个星星。

思路:

这题给的输入数据很祥和,间接提示思路了。

用x作为树状数组的区间,然后按照输入的顺序不断查找在包括自己的位置以及左边的星星数。

细节是x可能是0,这是树状数组不能接受的,需要对输入的x数据进行加一操作。

从这题可以看出树状数组最直白的作用就是求从1开始到某个点的某个区间的数量。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int tree[33000];
int ans[16000],n;
int findans(int tar)
{
    int sum=0;
    while(tar>0)
    {
        sum+=tree[tar];
        tar-=tar&(-tar);
    }
    return sum;
}
void updat(int tar)
{
    while(tar<=32001)
    {
        tree[tar]++;
        tar+=tar&(-tar);
    }
}
int main()
{
    memset(ans,0,sizeof(ans));
    memset(tree,0,sizeof(tree));
    int a,b;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&a,&b);
        a++;
        //printf("%d\n",findans(a));
        ans[findans(a)]++;
        updat(a);
    }
    for(int i=0;i<n;i++)
    {
        printf("%d\n",ans[i]);
    }
    return 0;
}

 

POJ 2352 【树状数组】

标签:

原文地址:http://www.cnblogs.com/tun117/p/4965136.html

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