题意:给出n个平面二维坐标,对于每个坐标,如果这个坐标跟(0,0)形成的矩形内包含的点数为 k (包含边界,但不包含坐标本身),那么这个坐标就是 level k。输出level 0 - n-1的点数分别是多少。
思路:树状数组,线段树 稍后写一个线段树版本
#include <stdio.h> #include <string.h> #define N 15005 #define M 32005 int c[M], s[N]; int ans[N]; int n, max ,y; int lowbit(int x) { return x&(-x); } int sum(int x) { int sum=0; while(x>0) { sum+=c[x]; x-=lowbit(x); } return sum; } void change(int x,int val) { while(x<=max+1) { c[x]+=val; x+=lowbit(x); } } int main() { // freopen("in.txt", "r", stdin); scanf("%d", &n); max = 0; for(int i=1; i<=n; i++) { scanf("%d%d", &s[i], &y); max = s[i] > max ? s[i] : max; } memset(ans, 0, sizeof(ans)); for(int i=1; i<=n; i++) { ans[sum(s[i]+1)]++; change(s[i]+1,1); } for(int i=0;i<n;i++) printf("%d ", ans[i]); return 0; }