标签:style class blog c code tar
题意:
输入一个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; }
标签:style class blog c code tar
原文地址:http://www.cnblogs.com/baoluqi/p/3738020.html