题意 : 给你若干个星星,然后给出你每个星星的坐标(按照y递增的顺序给出,若是y相同就按照x递增的顺序给出),定义所谓的星星级别为横纵坐标不超过自己的星星的个数。问级别0到n-1的星星各有多少个。
思路 :因为当前的星星与后面的星星没有关系,所以只要把x之前的横坐标加起来就行,树状数组模板题,但是树状数组下标是从1开始的,所以x要加1。

#include <iostream> #include <stdio.h> #include <string.h> using namespace std; const int maxn = 100000 ; int tree[maxn+10] ;//树状数组 inline int lowbit(int x)//lowbit(i)表示i最低的二进制位 { return(x&(-x)) ; } void add(int x) { for(int i = x ; i <= maxn ; i += lowbit(i) ) { tree[i] += 1 ; } } int get(int x) { int sum = 0 ; for(int i = x ; i ; i -= lowbit(i)) { sum += tree[i] ; } return sum ; } int main() { int n ; int ans[maxn] ;//保存等级 while(scanf("%d",&n)!=EOF) { int x,y ; memset(ans,0,sizeof(ans)) ; for(int i = 0 ; i < n ; i++) { scanf("%d %d",&x,&y) ; x++ ;y++ ; ans[get(x)]++ ; add(x) ; } for(int i = 0 ; i < n ; i++) printf("%d ",ans[i]) ; } return 0; }