POJ 2481 - Cows

题目描述

Cows

题目描述

S i < = S j   a n d   E j < = E i   a n d   E i − S i > E j − S j S_i <= S_j\ and\ E_j <= E_i\ and\ E_i - S_i > E_j - S_j Si<=Sj and Ej<=Ei and EiSi>EjSj 表示牛 i i i 比牛 j j j 壮,翻译一下就是:

在这里插入图片描述
那这样子就很好处理了,我们希望 E E E 越大 S S S 越小。于是,我们先按照 E E E 从大到小排列一遍,这样就可以保证后面处理时拿到的 E i E_i Ei 都大于其后面的元素。对于 E i = E j E_i=E_j Ei=Ej,下一步我们希望的是 S i < S j S_i<S_j Si<Sj,这个很好用树状数组解决, s u m ( S i ) sum(S_i) sum(Si)就可以求得比 S i S_i Si 更小的元素个数,也就得到了比当前更壮的牛的数目。

#include <iostream>
#include <algorithm>
#include <string.h>

using namespace std;

int c[100010], cnt[100010];
int n, x, y, mmax;

struct cow{
    int s, e;
    int id;
}cows[100010];

bool cmp(const cow& a, const cow& b){
    if(a.e==b.e) return a.s<b.s;
    return a.e>b.e;
}

int lowbit(int x){return x&(-x);}

void add(int x){
    for(int i=x;i<=n;i+=lowbit(i))
        c[i] += 1;
}

int sum(int x){
    int s = 0;
    for(int i=x;i;i-=lowbit(i))
        s += c[i];
    return s;
}

int main()
{
    while(scanf("%d", &n) && n)
    {

        mmax = 0;
        memset(c, 0, sizeof(c));
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d", &x, &y);
            cows[i].s = x+1; cows[i].e = y+1;
            cows[i].id = i;
            if(cows[i].e>mmax) mmax = cows[i].e;
        }
        sort(cows+1, cows+1+n, cmp);
        for(int i=1;i<=n;i++)
        {
            if(i>1 && cows[i].s==cows[i-1].s && cows[i].e==cows[i-1].e)
                cnt[cows[i].id] = cnt[cows[i-1].id];
            else cnt[cows[i].id] = sum(cows[i].s);
            add(cows[i].s);
        }
        for(int i=1;i<=n;i++)
        {
            if(i!=1) printf(" ");
            printf("%d", cnt[i]);
        }
        printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值