您的位置:首页 > 其它

POJ 2481 Cows(树状数组)

2017-09-16 10:43 465 查看
Cows

题意:对于每头牛,吃草的区间在li,ri之间,问在n头牛中,对于第i头牛而言,有几头牛的区间大于这头牛。

先按ri排序(固定一个方向),再用树状数组对li即可。

代码:

#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;

const int max_n=1e5+5;

struct node
{
int l,r,id;
} a[max_n];

int bit[max_n];
int ans[max_n];
int n,maxr;

bool cmp(node a,node b)
{
if(a.r!=b.r)
return a.r>b.r;
return a.l<b.l;
}

int sum(int x)
{
int ret = 0;
while(x>0)
{
ret+=bit[x];
x-=x&-x;
}
return ret;
}

void add(int x,int d)
{
while(x<=maxr+1)
{
bit[x]+=d;
x+=x&-x;
}
}

int main()
{
int l,r;
while(scanf("%d",&n),n)
{
memset(ans,0,sizeof(ans));
memset(bit,0,sizeof(bit));
maxr = -1;
for(int i = 1; i<=n; i++)
{
scanf("%d%d",&a[i].l,&a[i].r);
a[i].id = i;
maxr = max(maxr,a[i].r);
}
sort(a+1,a+1+n,cmp);
for(int i = 1; i<=n; i++)
{
if(a[i].l == a[i-1].l && a[i].r == a[i-1].r)//题目要求大于此区间的
{
ans[a[i].id] = ans[a[i-1].id];
}
else
{
ans[a[i].id] = sum(a[i].l+1);
}
add(a[i].l+1,1);
}

for(int i = 1; i<=n; i++)
printf("%d%c",ans[i],(i==n)?'\n':' ');
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: