LOJ10114 数星星(树状数组)

地址:https://loj.ac/problem/10114

     解析:由于坐标是按y递增排序,所以对于一个点来讲,只看之前x小于等于它的就可以了。那么对于输入的每个点,求之前x小于等于它的,就得用树状数组维护。树状数组c[i]表示x=i时,它之前x小于等于它的有几个点。个数就是级数,num[]来记录。x+1防止死循环

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=32001;
int num[maxn];
int c[maxn];
int lowbit(int i)
{
    return i&(-i);
}
void update(int x)
{
    for(int i=x;i<=maxn;i+=lowbit(i))
        c[i]++;
}
int getsum(int x)
{
    int sum=0;
    for(int i=x;i>0;i-=lowbit(i))
    {
        sum+=c[i];
    }
    return sum;
}
int main()
{
    int n;
    cin>>n;
    int x,y;
    for(int i=1;i<=n;i++)
    {
        cin>>x>>y;
        x++;
        num[getsum(x)]++;
        update(x);
    }
    for(int i=0;i<n;i++)
        cout<<num[i]<<endl;
}
原文地址:https://www.cnblogs.com/liyexin/p/12853300.html