POJ 2352 Star 树状数组

来源:互联网 发布:淘宝上卖aj高仿的店铺 编辑:程序博客网 时间:2024/06/10 01:10

题目链接


在坐标上有n个星星,如果某个星星坐标为(x, y), 它的左下位置为:(x0,y0),x0<=x 且y0<=y。如果左下位置有a个星星,就表示这个星星属于level x

按照y递增,如果y相同则x递增的顺序给出n个星星,求出所有level水平的数量。


题目中输入是按照y递增,如果y相同则x递增的顺序给出的, 所以,对于第i颗星星,它的level就是之前出现过的星星中,横坐标x小于等于i星横坐标的那些星星的总数量(前面的y一定比后面的y小)。

所以,需要找到一种数据结构来记录所有星星的x值,方便的求出所有值为0~x的星星总数量。


树状数组可以解决这一类求和问题。


#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<queue>#include<vector>using namespace std;#define Maxn 32005int n,v[Maxn],level[Maxn];int Lowbit(int x){    return x&(-x);}void Add(int pos,int val){    while(pos<=Maxn){        v[pos]+=val;        pos+=Lowbit(pos);    }}int Sum(int End){    int sum=0;    while(End>0){        sum+=v[End];        End-=Lowbit(End);    }    return sum;}int main(){    //freopen("F:\\11.txt","r",stdin);    scanf("%d",&n);    for(int i=0;i<n;i++){        int x,y;        scanf("%d%d",&x,&y);        x++;        level[Sum(x)]++;        Add(x,1);    }    for(int i=0;i<n;i++){        printf("%d\n",level[i]);    }    return 0;}



0 0