典型线段树,因为Input已经按Y坐标处理过了,所以程序只需处理X值就行了,也就是查询、更新。
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 const int N = 32005; 5 int tree[4*N],D; 6 int level[15010]; 7 void update(int n) 8 { 9 for(; n^1; n>>=1) 10 tree[n>>1] = tree[n] + tree[n^1]; 11 } 12 void query(int cur,int x,int y,int s,int t,int &ans) 13 { 14 int mid = (x+y)>>1; 15 if(x >= s && y <= t) 16 { 17 ans += tree[cur]; 18 return ; 19 } 20 if(s <= mid) 21 query(cur<<1,x,mid,s,t,ans); 22 if(mid+1 <= t) 23 query(cur<<1|1,mid+1,y,s,t,ans); 24 } 25 int main() 26 { 27 int n,x,y,i,j,ans; 28 for(D = 1; D < 32000; D <<=1); 29 while(cin>>n) 30 { 31 memset(tree,0,sizeof(int) *2*D); 32 memset(level,0,sizeof(int) *n); 33 for(j = 0; j < n; j++) 34 { 35 cin>>x>>y; 36 ans = 0; 37 query(1,0,D-1,0,x,ans); 38 level[ans]++; 39 tree[D+x]++; 40 update(D+x); 41 } 42 for(i = 0; i < n; i++) 43 cout<<level[i]<<endl; 44 } 45 return 0; 46 }