poj2481树状数组

原创 2016年08月31日 09:55:12

每个牛有一个区间[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;
}

相关文章推荐

poj 2481 Cows(树状数组)

题目链接:点击打开链接 题意:给定一群牛和他们

树状数组 之 poj 2481

/* 虽然事先知道这题可用树状数组求解, 但对之前 poj 2352 理解不够深刻啊。。。花了好久,才想出办法了。。。 其实和 poj 2352 解法一样,只不过不是那么明显了。 先对 e 进行从大到...

poj 2481 Cows--树状数组 + 区间真子集个数

原题链接:http://poj.org/problem?id=2481 题意:求区间真子集个数。 #define _CRT_SECURE_NO_DEPRECATE #includ...
  • LaoJiu_
  • LaoJiu_
  • 2016年11月18日 11:01
  • 248

树状数组专题入门——POJ 2352,1556,2155,3321,1990,2309,1195,2481,2299,3067

树状数组专题入门——POJ 2352,1556,2155,3321,1990,2309,1195,2481,2299,3067...

poj2481-树状数组的应用

//***********************************************解决思想************************************ 对于这种有两个关键...

poj2481-树状数组

这里就是求区间覆盖问题,如果你的区间完全覆盖它的,那么你就比他强壮。求出比自己强壮的牛数。   树状数组: 树状数组是一个查询和修改复杂度都为log(n)的数据结构,假设数组a[1..n], ...

POJ 2481 Cows (线段树||树状数组)

Farmer John's cows have discovered that the clover growing along the ridge of the hill (which we can...

POJ 2481 树状数组

  Cows Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12764   ...
  • tanmlh
  • tanmlh
  • 2014年09月03日 14:37
  • 196

POJ2481 Cows(线段树 & 树状数组)

Cows Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 14777   Accepted: 4890 ...
  • GKHack
  • GKHack
  • 2015年09月01日 17:30
  • 699

poj 2481 cows 树状数组

poj 2481 cows 树状数组
  • k_l_c_
  • k_l_c_
  • 2016年07月08日 14:38
  • 163
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj2481树状数组
举报原因:
原因补充:

(最多只允许输入30个字)