#include<stdio.h> #include<string.h> #define L 32000 #define N 15000 struct node{ int l; int r; int sum; }; node tree[3*L]; int count[N] = {0}; int n; void buid_tree(int k,int left,int right) { int mid; tree[k].l = left; tree[k].r = right; if(right-left == 1){ tree[k].sum = 0; return ; } mid = (left+right)/2; buid_tree(2*k,left,mid); buid_tree(2*k+1,mid,right); tree[k].sum = tree[2*k].sum+tree[2*k+1].sum; return ; } void tree_insert(int k,int left,int right) { int mid; if(left <= tree[k].l && right >= tree[k].r){ tree[k].sum += 1; return ; } mid = (tree[k].l+tree[k].r)/2; if(left < mid) tree_insert(2*k,left,right); if(right > mid) tree_insert(2*k+1,left,right); tree[k].sum = tree[2*k].sum+tree[2*k+1].sum; return ; } int get_sum(int k,int left,int right) { int mid; int ls = 0,rs = 0; if(left <= tree[k].l && right >= tree[k].r){ return tree[k].sum; } mid = (tree[k].l+tree[k].r)/2; if(left < mid) ls = get_sum(2*k,left,right); if(right > mid) rs = get_sum(2*k+1,left,right); return ls+rs; } int main() { int i,j; int x,y; while(scanf("%d",&n) == 1){ buid_tree(1,0,L+1); memset(count,0,sizeof(count)); for(i = 0;i < n;i++){ scanf("%d %d",&x,&y); count[get_sum(1,0,x+1)]++; tree_insert(1,x,x+1); } for(i = 0;i < n;i++){ printf("%d/n",count[i]); } } return 0; } //第二道线段树的题,别人都说是水题,不过我真的做得好吃力哦 //一个是因为对线段树的一些操作还不熟,第二个是还是没有真正理解线段树的本质!