当前位置: 代码迷 >> 综合 >> POJ 2481 - Cows
  详细解决方案

POJ 2481 - Cows

热度:16   发布时间:2023-12-13 03:55:31.0

题目描述

Cows

题目描述

Si<=SjandEj<=EiandEi?Si>Ej?SjS_i <= S_j\ and\ E_j <= E_i\ and\ E_i - S_i > E_j - S_jSi?<=Sj? and Ej?<=Ei? and Ei??Si?>Ej??Sj? 表示牛 iii 比牛 jjj 壮,翻译一下就是:

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

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