zoukankan      html  css  js  c++  java
  • poj 2481 cows(树状数组)

    题目链接:poj 2481 cows

    题意:给出n个牛的坐标,i牛的坐标为[Si,Ei],j牛的坐标为[Sj,Ej],若Si<=Sj,Ej<=Ei并且Ei-Si>Ej-Sj,则牛i比牛j强壮,现在呀要求出每个牛比它强壮的牛的数量。

    分析:这道题和poj2352类似,poj 2352是要求在某点左下角的点有多少个,这一题则可以看成是求在某点左上角的点的个数,按纵坐标从大到小排序,横坐标从小到大排序,然后用树状数组求在该点左边的点的数量即可。需要注意的是,对于相同的点,不需要重复计算,直接赋值就行了,不然会超时的。

    不过这道题我有一点纳闷的就是,输出的时候我用if()来判断下标确定是该输出空格还是换行的时候居然超时了,改成不用if()判断的输出时就能过,这实在是坑爹。。。。什么破数据呀,用的着这样卡么!!

    AC代码:

     1         #include<stdio.h>
     2         #include<string.h>
     3         #include<algorithm>
     4         using namespace std;
     5         #define N 100100
     6         int d[N],cnt[N];
     7         struct node{
     8             int x,y,i;
     9             bool operator <(const node &a)const{
    10                 if(y==a.y)
    11                     return x<a.x;
    12                 return y>a.y;
    13             }
    14         }s[N];
    15         int n;
    16         int lowbit(int x)
    17         {
    18             return x&(-x);
    19         }
    20         void update(int x,int num)
    21         {
    22             while(x<=n)
    23             {
    24                 d[x]+=num;
    25                 x+=lowbit(x);
    26             }
    27         }
    28         int GetSum(int x)
    29         {
    30             int s=0;
    31             while(x>0)
    32             {
    33                 s+=d[x];
    34                 x-=lowbit(x);
    35             }
    36             return s;
    37         }
    38         int main()
    39         {
    40             int i;
    41             while(scanf("%d",&n)&&n)
    42             {
    43                 for(i=0;i<n;i++)
    44                 {
    45                     scanf("%d%d",&s[i].x,&s[i].y);
    46                     s[i].x++;
    47                     s[i].y++;
    48                     s[i].i=i;
    49                 }
    50                 sort(s,s+n);
    51                 memset(d,0,sizeof(d));
    52                 for(i=0;i<n;i++)
    53                 {
    54                     if(i>0&&s[i].x==s[i-1].x&&s[i].y==s[i-1].y)
    55                         cnt[s[i].i]=cnt[s[i-1].i];
    56                     else
    57                         cnt[s[i].i]=GetSum(s[i].x);
    58                     update(s[i].x,1);
    59                 }
    60                 for(i=0;i<n;i++)
    61                 {
    62                     if(i==n-1)
    63                         printf("%d
    ",cnt[i]);
    64                     else
    65                         printf("%d ",cnt[i]);
    66                 }
    67             }
    68             return 0;
    69         }
    View Code
  • 相关阅读:
    Altium Designer 16 问题解决
    IAR FOR AVR 仿真过程中出现全局变量值不断随意变化的问题
    linux '--stdin'错误 -批量修改密码
    EmWin 字体相关函数
    EmWin 文本显示函数
    Win10下 usart驱动PL2303无法安装的问题
    EmWin 接触---基础函数
    Linux 下 Samba 服务器搭建
    MPLAB X IDE V4.15 创建工程,编译,问题处理
    EF Core MVC
  • 原文地址:https://www.cnblogs.com/frog112111/p/3263497.html
Copyright © 2011-2022 走看看