poj2481树状数组

每个牛有一个区间[s,e],两个牛[s1,e1], [s2,e2],当s1<=s2并且e1>=e2并且e1-s1>e2-s2时,我们说牛1比牛2强,给N个牛的区间,对于每个牛,输出比这个牛强的牛的个数。
还是需要预处理,先对每个牛的e进行降序排序,e相同时对s进行升序排列,这样循环时可以保证后边的牛绝对不比前边的牛强。在循环时,只需找出比当前牛s小的牛的个数。如果遇到特殊情况,即两个牛区间完全一样,赋值就可以了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn=100005;

int b[maxn];
int c[maxn];
int n;

struct cow
{
    int l,r;
    int dis;
}a[maxn];
int cmp(const cow &a,const cow &b)
{
    if(a.r==b.r)
    return a.l<b.l;
    else
    return a.r>b.r;
}
int lowbit(int x)
{
    return x&-x;
}
void update(int x,int add)
{
    while(x<=maxn)
    {
        c[x]+=add;
        x+=lowbit(x);
    }
}
int sum(int x)
{
    int ret=0;
    while(x)
    {
        ret+=c[x];
        x-=lowbit(x);
    }
    return ret;
}

int main()
{
    while(~scanf("%d",&n)&&n)
    {
        memset(c,0,sizeof(c));
        memset(b,0,sizeof(b));
        int p;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&a[i].l,&a[i].r);
            a[i].dis=i;
            a[i].l++;
            a[i].r++;
        }
        sort(a,a+n,cmp);
        for(int i=0;i<n;i++)
        {
            if(i&&a[i].l==a[i-1].l&&a[i].r==a[i-1].r)
            b[a[i].dis]=b[a[i-1].dis];
            else
            b[a[i].dis]=sum(a[i].l);
            update(a[i].l,1);
        }
        for(int i=0;i<n-1;i++)
        printf("%d ",b[i]);
        printf("%d\n",b[n-1]);
    }
    return 0;
}
    原文作者:B树
    原文地址: https://blog.csdn.net/aonaigayiximasi/article/details/52382064
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞