<span>POJ2352 stars 修改某个位置上的值,查找一段区间的和(向上修改,向下统计)</span>

链接:

http://poj.org/problem?id=2352

题目大意:

在坐标上有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 <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
#define MAXN 32005
int c[MAXN],level[MAXN];
int lowbit(int x)
{
    return x&(-x);
}
void update(int x,int num)
{
    while(x<=MAXN)
     {
         c[x]+=num;
         x+=lowbit(x);
     }
}
int getSum(int x)
{
    int s=0;
    while(x>0)
     {
         s+=c[x];
         x-=lowbit(x);
     }
    return s;
}

int main()
{
    int n,x,y;
    while(~scanf("%d",&n))
    {
        memset(c,0,sizeof(c));
        memset(level,0,sizeof(level));
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&x,&y);
            x++;
            level[getSum(x)]++;
            update(x,1);
        }
        for(int i=0;i<n;i++) printf("%d\n",level[i]);
    }
    return 0;
}

 

全部评论

相关推荐

贪食滴🐶:你说熟悉扣篮的底层原理,有过隔扣职业球员的实战经验吗
点赞 评论 收藏
分享
11-15 18:39
已编辑
西安交通大学 Java
全村最靓的仔仔:卧槽,佬啥bg呢,本也是西交么
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务