Cows POJ - 2481
1 题意
给出n个牛的取食范围 [Si,Ei],若Si<= Sj,Ej<=Ei,Ei-Si > Ej-Sj;则称i牛大于j牛,问对于每一个牛,有多少个牛比它大
2 分析
对于n个牛,先按照右端点进行排序,排序之后用树状数组插入和查询,只需要比较左端点,左端点比i牛小,说明比i牛大(相等的除外)
4 参考代码
const int LEN = 1e5+100;
int tree[LEN];
struct Cow
{
int s,e;
int ID;
};
bool operator<(const Cow &a,const Cow &b)
{
if(a.e!=b.e)
return a.e>b.e;
return a.s < b.s;
}
//int sum_of_len[LEN];
Cow cow[LEN];
int num[LEN];
int maxn = 0;
void Update(int x)
{
while(x<=maxn+1)
{
tree[x]++;
x += lowbit(x);
}
}
int Query(int x)
{
int sum = 0;
while(x>0)
{
sum += tree[x];
x -= lowbit(x);
}
return sum;
}
int main()
{
// freopen("D:\\in.txt","r",stdin);
int N;
while(cin>>N&&N)
{
maxn = 0;
memset(tree,0,sizeof(tree));
memset(num,0,sizeof(num));
for(int i = 1; i <= N; ++i)
{
scanf("%d %d",&cow[i].s,&cow[i].e);
cow[i].ID = i;
maxn = max(cow[i].s,maxn);
}
sort(cow+1,cow+N+1);
for(int i = 1; i <= N; ++i)
{
if (cow[i].e==cow[i-1].e&&cow[i].s==cow[i-1].s)
num[cow[i].ID] = num[cow[i-1].ID];
else
{
int t = 0;
t = Query(cow[i].s+1);
num[cow[i].ID] =t;
}
Update(cow[i].s+1);
}
for(int i = 1; i <= N; ++i)
{
if(i>1)
printf(" ");
printf("%d",num[i]);
}
printf("\n");
}
return 0;
}