题目链接: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;
}