POJ 2481 Cows

分析:每一头牛都一片领域[s,e]如果一头牛的[s,e]包含另一头牛的[s,e],那么就比另一头牛强,于是我们先把牛排序,e大的排在前,相等的话就s小的排在前,这样排在前面的牛一定不会比排在后面的牛弱,如果两头牛的s和e都相等的话,那么比他们强壮的牛的数量也相等,不然的话求比一头牛强的数量只要求出s<=这头牛的牛的数量就可以。

# include <stdio.h>
# include <string.h>
# include <algorithm>
  using namespace std;
  typedef struct node
  {
      int s,e,num;
  }Node;
  int n,c[100005],ans[100005];
  Node cow[100005];
  bool cmp(Node a,Node b)
  {
      if(a.e==b.e)
        return a.s<b.s;
    else
        return a.e>b.e;
  }
  int lowbit(int x)
  {
      return x&(-x);
  }
  int sum(int n)
  {
      int s=0;
      while(n>0)
      {
          s+=c[n];
          n-=lowbit(n);
      }
      return s;
  }
  void update(int i,int value)
  {
      while(i<=100005)
      {
          c[i]+=value;
          i+=lowbit(i);
      }
  }
  int main()
  {
      int i,s,e;
      while(scanf("%d",&n),n!=0)
      {
          for(i=0;i<n;i++)
          {
              scanf("%d%d",&s,&e);
              cow[i].s=++s;
              cow[i].e=++e;
              cow[i].num=i;
          }
          sort(cow,cow+n,cmp);
          memset(c,0,sizeof(c));
          for(i=0;i<n;i++)
          {
              if(i!=0&&cow[i].s==cow[i-1].s&&cow[i].e==cow[i-1].e)
                ans[cow[i].num]=ans[cow[i-1].num];
              else
                ans[cow[i].num]=sum(cow[i].s);
              update(cow[i].s,1);
          }
          for(i=0;i<n-1;i++)
            printf("%d ",ans[i]);
          printf("%d\n",ans[i]);
      }
      return n;
  }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值