注意到题目中给的y是递增的,那个y没什么用,直接线段树维护一段1,x的区间。
#include<string> #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=32005; int record[32005]; struct node { int l,r; int n; }s[3*N+10]; void build(int l,int r,int k){ if(l==r){ s[k].l=s[k].r=l; s[k].n=0; return ; } int mid=(l+r)>>1; s[k].l=l; s[k].r=r; s[k].n=0; build(l,mid,k<<1); build(mid+1,r,k<<1|1); s[k].n=s[k<<1].n+s[k<<1|1].n; } void update(int d,int k) { if(s[k].l==s[k].r&&s[k].l==d) { s[k].n++; return; } int mid=(s[k].l+s[k].r)/2; if(d<=mid) update(d,2*k); else update(d,2*k+1); s[k].n=s[2*k].n+s[2*k+1].n; } int ans=0; void query(int l,int r,int k) { if(s[k].l==l&&s[k].r==r) { ans+=s[k].n; return ; } int mid=(s[k].l+s[k].r)/2; if(r<=mid) query(l,r,2*k); else if(l>mid) query(l,r,2*k+1); else { query(l,mid,2*k); query(mid+1,r,2*k+1); } } int main() { int n; while(scanf("%d",&n)!=EOF){ int i; int mm=n; memset(record,0,sizeof(record)); build(1,N,1); for(i=0;i<n;i++){ int a,b; scanf("%d%d",&a,&b); a++; //题目中可能a=0 我建线段树,不喜欢建0,故给他加了1 ans=0; query(1,a,1); record[ans]++; update(a,1); } for(i=0;i<mm;i++) printf("%d\n",record[i]); } return 0; }
原文:http://blog.csdn.net/cnh294141800/article/details/23181283