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
原文地址:https://www.cnblogs.com/baoluqi/p/3738020.html