poj2481 Cows

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

  

原文地址:https://www.cnblogs.com/edmunds/p/13657666.html