您的位置:首页 > 其它

POJ 2481 Cows

2015-07-13 20:23 204 查看
分析:每一头牛都一片领域[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-=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;
  }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: