树状数组——POJ-2352

题目含义

给出一堆星星的横纵坐标

指定一个星星的大小是横坐标小于等于它且纵坐标小于它的星星个数

要求你求出各个大小的星星的个数

题目分析

这道题可以用树状数组做,但需要一点巧妙的转化

如果把星星按纵坐标从小到大进行处理,这个星星的大小就是横坐标小于等于它的星星的个数

这样就只用考虑横坐标,并通过树状数组计算星星大小

注意:由于计算大小有while(x)这一步骤,同时星星的横坐标可能为0,所以最好x++,不然会TLE

题目代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=32007;
const int maxm=15007;
int n,x,y;
int c[maxn],num[maxm];
int lowbit(int x){
    return x&(-x);
}
int get(int x){
    int ans=0;
    while(x){
        ans+=c[x];
        x-=lowbit(x);
    }
    return ans;
}
void insert(int x){
    while(x<=maxn){
        c[x]++;
        x+=lowbit(x);
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&x,&y),x++;
        num[get(x)]++;
        insert(x);
    }
    for(int i=0;i<n;i++)
        printf("%d
",num[i]);
    return 0;
}
原文地址:https://www.cnblogs.com/helman/p/11232783.html