典型线段树,因为Input已经按Y坐标处理过了,所以程序只需处理X值就行了,也就是查询、更新。
1 #include2 #include 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< <