题意:
输入一个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;
}
Car race game