DAY 3 问题 B: 超车

来源:互联网 发布:sql linq lambda 编辑:程序博客网 时间:2024/05/17 06:47

问题 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

原创粉丝点击