我是靠谱客的博主 欣慰朋友,最近开发中收集的这篇文章主要介绍HDOJ 1541 star(树状数组),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


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


这道题告诉我们若干颗星星的坐标,告诉我们的时候y坐标已经按照升序排列了。对于每一颗星,它的等级数等于它左边和左上角星星的颗数。最后问每一颗星星的等级。

把星星按照给我们的顺序(就是y坐标从小到大的顺序),依次把一个数组中下标为x的元素加1。对于某一颗星,坐标为x,那么把数组中下标为x及之前的所有元素相加,就是求了这颗星左边及左上角的星星数,然后再把下标为x的元素加1。(这颗星星本身不能算进去)


#include<cstdio>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 32005
using namespace std;
int n, c[N], level[N];
int lowbit(int x)
{
    return x & (-x);
}
int query(int x)
{
    int sum = 0;
    while (x > 0)
    {
        sum += c[x];
        x -= lowbit(x);
    }
    return sum;
}
int add(int i, int d)
{
    while (i <= 32001)
    {
        c[i] += d;
        i += lowbit(i);
    }
}
int main()
{
    int ans, x, y;
    while (~scanf("%d", &n))
    {
        memset(c, 0, sizeof(c));
        memset(level, 0, sizeof(level));
        for (int i = 1; i <= n; i++)
        {
            scanf("%d%d", &x, &y);
            x++;
            ans = query(x);
            level[ans]++;
            add(x, 1);
        }
        for (int i = 0; i < n; i++)
            printf("%dn", level[i]);
    }
    return 0;
}

最后

以上就是欣慰朋友为你收集整理的HDOJ 1541 star(树状数组)的全部内容,希望文章能够帮你解决HDOJ 1541 star(树状数组)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部