• Car race game


    题意:

    输入一个n以EOF作为结束,之后n行每行输入一个x,一个v,x代表当前车的坐标,v代表车的速度,问最后总共的超车数。

    解题思路:

    思路其实很简单,用将车排序,按照x1<x2排序如果x1==x2按照y1>y2排序。然后比较就好了,当x1<x2,y1>y2时超车数就增加。

    不过这题数据量比较大,暴力搜索的话肯定超时。在网上看到别人的思路才明白,也了解了什么是树状数组。其实也不难理解,就是把需要

    求和的东西提前做预处理,以后再加的时候就会快很多,空间换时间。

    具体代码:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace    std;
     
    #define  MAXX 1000001
     
    struct node{ int x,y; } p[100005];
     
    long long  c[1000005];
     
    bool ccmp(node a,node b)//这样排序的意义......
    {
        if( a.x==b.x )
        return a.y>b.y;
        return a.x<b.x;
    }
     
    int lowbit(int x)
    {
        return x&(-x);
    }
     
    void adding(int x)
    {
        while( x<MAXX )
        {
            c[x]++;
            x += lowbit(x);
        }
    }
     
    long long  getsum( int x )
    {
        long long  sum = 0;
        while( x>0 )
        {
            sum += c[x];
            x -= lowbit(x);
        }
        return sum;
    }
     
    int main()
    {
        int n,i,j,k;
        long long ans;
     
        while(scanf("%d",&n)!=EOF)
        {
            for(i=0;  i<n;  i++  )
                scanf("%d%d",&p[i].x,&p[i].y);
     
            sort(p,p+n,ccmp);
     
            for(i=0;  i<=MAXX;  i++  )
            c[i] = 0; 
            ans=0;
    
            for(i=0; i<n; i++ )//i表示当前左边点的总数,
            {
                ans += ( i - getsum(p[i].y));//减去左下方的就可以了
                adding( p[i].y );
            }
            for(int i=0;i<n;i++)
                cout<<c[i]<<"  *";  
            cout<<ans<<endl;
        }
        system("pause"); 
        return 0;
    }
    View Code
  • 相关阅读:
    win10安装.net3.5
    VS2015密钥
    wordpress目录文件结构说明
    js | javascript获取和设置元素的属性
    wordpress | WP Mail SMTP使用QQ邮箱发布失败的解决办法
    jquery 实时监听输入框值变化方法
    XPath编写规则学习
    如何将portfolio产品图片上的悬停去掉?
    wordpress怎么禁止文章复制
    js | javascript实现浏览器窗口大小被改变时触发事件的方法
  • 原文地址:https://www.cnblogs.com/baoluqi/p/3738020.html
Copyright © 2020-2023  润新知