Description
有N艘飞船进行比赛,它们的跑道为直线并互相平行。每个飞船的起跑位置均不相同。第i个飞船从Xi处开始向右行驶(Xi各不相同)。比赛开始后,它能在零时间内加速到最大速度并永远保持此速度。假设这里的比赛没有终点。
你的任务是算出比赛过程中一共有多少次“超车”。
Input
输入文件数据格式如下:
第一行为一个整数N(1≤N≤250000)。
接下来的N行,每行两个整数Xi(0≤Xi≤10^6)和Vi(0<Vi<100),描述了一艘飞船的起跑位置和最大速度。
给出的飞船信息按照起跑位置Xi的升序排列,即X1
Output
程序运行结束时,在屏幕上输出“超车”的次数对1000000的模。
Sample Input
4
0 2
2 1
3 8
6 3
0
Sample Output
2
思路
赛道无限=忽略起点=>求逆序对=>代码TLE=>最后发现是输入太慢(美好的做题过程)
code:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[250000+33],b[250000+33];
int s;
void f(int l,int mid,int r)
{
int x=l,y=mid+1,t=0;
while (x<=mid&&y<=r)
{
if (a[x]<=a[y]) b[++t]=a[x++];
else
{
s+=(mid+1-x);
s%=1000000;
b[++t]=a[y++];
}
}
while (x<=mid) b[++t]=a[x++];
while (y<=r) b[++t]=a[y++];
for (int i=1;i<=t;i++) a[l+i-1]=b[i];
return;
}
void ff(int l,int r)
{
if (l==r) return;
int mid=(l+r)>>1;
ff(l,mid);
ff(mid+1,r);
f(l,mid,r);
}
int main()
{
int x,n;
while(~scanf("%d",&n)&&n)
{
for (int j=1;j<=n;j++)
{
scanf("%d%d",&x,&a[j]);
}
s=0;
ff(1,n);
printf("%d\n",s);
}
return 0;
}