/*
用线段树水的,初始化落了e[c].l=e[c].r=a,无限循环了
题意:求等级为1~n的个数,每个点的等级就是左下矩形范围内的星星数
*/
#include <stdio.h> #include <string.h> int n,m,f[15001],x[15001],y[15001]; struct node{ int l,r; int w; }e[15000*6]; void build(int a,int b,int c) { if(a==b) { e[c].l=a; e[c].r=b; e[c].w=0; return; } e[c].l=a; e[c].r=b; e[c].w=0; int mid=(a+b)/2; build(a,mid,2*c); build(mid+1,b,2*c+1); } void add(int a,int c) { if(e[c].l==a&&e[c].r==a) { e[c].w++; return; } e[c].w++; int mid=(e[c].l+e[c].r)/2; if(a>mid) add(a,2*c+1); else add(a,2*c); } int query(int a,int b,int c) { //printf("1\n"); if(a==e[c].l&&b==e[c].r) return e[c].w; int mid=(e[c].l+e[c].r)/2; if(a>mid) return query(a,b,2*c+1); else if(b<=mid) return query(a,b,2*c); else return query(a,mid,2*c)+query(mid+1,b,2*c+1); } int main() { while(scanf("%d",&n)!=EOF) { int i,min=32001,max=-1; for(i=0;i<n;i++) { scanf("%d%d",&x[i],&y[i]); if(x[i]<min) min=x[i]; if(x[i]>max) max=x[i]; } build(min,max,1); memset(f,0,sizeof(f)); for(i=0;i<n;i++) { f[query(min,x[i],1)]++; add(x[i],1); } for(i=0;i<n;i++) printf("%d\n",f[i]); } return 0; }
/*
树状数组
*/
#include <stdio.h> #include <string.h> #define lowbit(x) x&(-x) int c[32001],f[15001]; void add(int x) { while(x<=32005) { c[x]++; x+=lowbit(x); } } int query(int x) { int sum=0; while(x>0) { sum+=c[x]; x-=lowbit(x); } return sum; } int main() { int n; while(scanf("%d",&n)!=EOF) { memset(c,0,sizeof(c)); memset(f,0,sizeof(f)); int i,x,y; for(i=0;i<n;i++) { scanf("%d%d",&x,&y); x++; f[query(x)]++; add(x); } for(i=0;i<n;i++) printf("%d\n",f[i]); } return 0; }