POJ 2481 Cows(树状数组)

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;  
}

猜你喜欢

转载自blog.csdn.net/m0_37846371/article/details/78001626
今日推荐