典型线段树,因为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 }