poj 2352 stars 【树状数组】

题目

题意:按y递增的顺序给出n颗星星的坐标(y相等则x递增),每个星星的等级等于在它左边且在它下边(包括水平和垂直方向)的星星的数量,求出等级为0到n-1的星星分别有多少个。

因为y递增的顺序给出,于是乎这道题跟 y 无关,在每次输入x的时候都去判断比x小,即在x之前的数有多少(ans)个,即星星的等级。然后更新num[ans]++  ( 存ans等级星星的个数num[ans]++ ).

刚开始觉得x不是值吗,怎么一会又变成下标了。其实x一直都是下标,既是题中坐标系的下标,也是树状数组中的下标。

#include <iostream>
#include <cstdio>
using namespace std;

const int N = 32010;
int num[N];
int c[N];

void add(int x,int val)
{
    while(x<=N)
    {
        c[x]+=val;
        x+=x&(-x);
    }
}
int sum(int x)
{
    int res = 0;
    while(x>0)
    {
        res += c[x];
        x -= x&(-x);
    }
    return res;
}
int main()
{
    int n,x,y;
    while(~ scanf("%d",&n))
    {
        for(int i=1; i<=n; i++)
        {
            scanf("%d%d",&x,&y);
            x++;//数状数组下标是从1开始的
            int ans =sum(x);
            num[ans]++;
            add(x,1);
        }
        for(int i=0; i<n; i++)
            printf("%d
",num[i]);
        memset(num,0,sizeof(num));
        memset(c,0,sizeof(c));
    }


    return 0;
}
原文地址:https://www.cnblogs.com/qie-wei/p/10160178.html