题目链接:https://vjudge.net/problem/POJ-2352
题意:求出每个星星左下边有多少个星星,再求每个level有多少个,level0表示左下角没星星的有多少个,level1表示有一个星星的有多少个。。。
思路:这个题目直接告诉你输入的顺序是按y从小到大的,y相同x从小到大排,这样用树状数组的时候就不需要考虑之前有y比自己大的
代码:
#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <numeric>
#include <set>
#include <string>
#include <cctype>
#include <sstream>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
typedef pair<LL, LL> P;
const int maxn = 15000 + 5;
const int mod = 1e8 + 7;
const int num=32005;
int n;
int bit[num];
int level[maxn];
int sum(int i){
int s=0;
while (i>0){
s+=bit[i];
i-=i&-i;
}
return s;
}
void add(int i,int x){
while (i<=num){
bit[i]+=x;
i+=i&-i;
}
}
int main() {
//freopen ("in.txt", "r", stdin);
while (~scanf ("%d",&n)){
for (int i=0;i<=maxn;i++){
bit[i]=0;
level[i]=0;
}
int x,y;
int tmp;
for (int i=0;i<n;i++) {
scanf ("%d%d",&x,&y);
add(x+1,1);
tmp=sum(x+1);
level[tmp-1]++;
}
for (int i=0;i<n;i++){
printf ("%d\n",level[i]);
}
}
return 0;
}