问题 B: 超车
时间限制: 1 Sec 内存限制: 128 MB
提交: 26 解决: 4
[提交][状态]
题目描述
Jzabc对赛车也很感兴趣,在参观车展是,想到这样一个问题,在某时刻,他看到n辆车(总是匀速行驶)在同一直线上,且处于一个无限长的直道上,而且n辆车有严格的先后之分,。他通过特殊的器材测出了每辆车的速度,那么问题出现了,如果有车A和车B,A在B的后面,且A的速度快于B的,那么经过一段时间后,A一定会超过B,我们称之为一次超车。那么他想请你帮忙计算超车总数。我们记车道起点的坐标为0 ,没有两辆车的坐标相同。

输入
第一行,一个数N,表示车辆总数。以下n行为N辆车的信息; 第二行至第N+1行,每行有两个正整数X、Y,X和Y之间有一个空格,其中X为车的坐标,Y为车的速度。 0<=X,Y<=1000000000

输出
一行,超车总数

样例输入
2
5 6
2 8
样例输出
1
提示

对于20%的数据,满足N<=300

对于50%的数据,满足N<=3000

对于100%的数据,满足N<=300000

#include<cstdio> 
#include<algorithm> 
#include<cstring> 
#include <iostream> 
#define mo 100000000 
#define int long long 
using namespace std;   
int n; 
struct NODE{ 
    int x,v; 
}dmf[300005]; 
int t[300005]; 
int tem[300005]; 
inline bool cmp(NODE a,NODE b){ 
    return a.x<b.x; 
} 
int ans=0; 
void gui(int l,int r){ 
    int i=l; 
    int mid=l+r>>1; 
    int j=mid+1; 
    int k=l; 
    while(i<=mid&&j<=r){ 
        if(t[i]>t[j]){ 
            tem[k++]=t[j++]; 
            ans+=mid-i+1; 
        } 
        else{ 
            tem[k++]=t[i++]; 
        } 
    } 
    while(i<=mid) tem[k++]=t[i++]; 
    while(j<=r) tem[k++]=t[j++]; 
    for(int i=l;i<=r;i++) 
     t[i]=tem[i]; 
} 
void work(int l,int r){ 
    if(l<r) 
    { 
        int mid=l+r>>1; 
        work(l,mid); 
        work(mid+1,r); 
        gui(l,r);        
    } 

} 
main(){ 
    scanf("%lld",&n); 
    for(int i=1;i<=n;i++){ 
        scanf("%lld%lld",&dmf[i].x,&dmf[i].v); 
    } 
    sort(dmf+1,dmf+n+1,cmp); 
    for(int i=1;i<=n;i++) t[i]=dmf[i].v; 
    work(1,n); 
    cout<<ans; 
    return 0; 
}

这题没啥用,就是复习下逆序对hiahiahia