因为y的输入是从小到大,所以不用考虑y坐标的问题
只考虑x坐标就行
还有个小细节就是0<=x,y,<=32000 x和y取0的时候树状数组处理不到
x++就行了
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; const int maxn = 32005; int a[maxn]; int c[maxn]; int getsum(int i); void add(int i,int k); int main() { int n,j,i,k,x,y; while(scanf("%d",&n) != EOF) { memset(c, 0, sizeof(c)); memset(a, 0, sizeof(a)); for(i=0;i<n;++i) { scanf("%d%d",&x,&y); x ++; a[getsum(x)]++; add(x,1); } for(i=0;i<n;++i) printf("%d ",a[i]); } } int lowbit(int k) { return k&(-k); } int getsum(int i) { int sum = 0; while(i > 0) { sum += c[i]; i-=lowbit(i); } return sum; } void add(int i,int k) { while(i <= 32000) { c[i]+=k; i+=lowbit(i); } }