题目链接:https://vjudge.net/problem/POJ-2481
题意:给定一些区间,问对于每个区间,有多少个其他区间把它包含(两个完全相同的区间不算)
对左端点排序,然后对右端点用求逆序对的方法,顺着扫一遍记录左边有多少个右端点大于等于它就可以了。一个坑点就是区间完全相同的情况
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N=1e5; struct st{int l,r,pos;}a[N+10]; int c[N+10],ans[N+10],n,i,j,k; bool cmp(st p,st q){return (p.l==q.l)?p.r>q.r:p.l<q.l;} //* void add(int x,int y){ for (int i=x;i<=N;i+=i&(-i)) c[i]+=y; } int ask(int x){ int res=0; for (int i=x;i>0;i-=i&(-i)) res+=c[i]; return res; } int main(){ while (scanf("%d",&n)){ if (n==0) break; memset(c,0,sizeof(c)); for (i=1;i<=n;i++) { scanf("%d%d",&a[i].l,&a[i].r); a[i].pos=i; } sort(a+1,a+n+1,cmp); for (i=1;i<=n;i++){ int j=i; while (a[j].l==a[j-1].l&&a[j].r==a[j-1].r) j--; ans[a[i].pos]=ask(N)-ask(a[i].r-1)-(i-j); add(a[i].r,1); } for (i=1;i<=n-1;i++) printf("%d ",ans[i]); printf("%d ",ans[n]); } return 0; }