UESTC

来源:互联网 发布:c语言病毒吃内存 编辑:程序博客网 时间:2024/06/03 16:11

Car race game

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
 

Bob is a game programming specialist. In his new car race game, there are some racers(nn means the amount of racers (1n100000)(1≤n≤100000)) racers star from someplace(xixi means Starting point coordinate),and they possible have different speed(VV means speed).so it possibly takes place to overtake(include staring the same point ). now he want to calculate the maximal amount of overtaking.

Input

The first line of the input contains an integer nn-determining the number of racers. Next nn lines follow, each line contains two integer XiXi and ViVi.(xixi means the ithith racer's Starting point coordinate, ViVi means the ith racer's speed.0<Xi,Vi<10000000<Xi,Vi<1000000).

Output

For each data set in the input print on a separate line, on the standard output, the integer that represents the maximal amount of overtaking.

Sample input and output

Sample InputSample Output
22 12 252 69 43 14 99 175 56 105 63 109 109 52 2
167

#include<string.h>#include<stdio.h>#include<algorithm>using namespace std;struct data{    int pos,speed;    int P=0;} y[1000003],x[1000003];long long a[1000033];long long c[1000003];long long  n;bool cmp(data a,data b){    if(a.pos==b.pos)        return a.speed>b.speed;    return a.pos<b.pos;}bool cmp1(data a,data b){    if(a.speed==b.speed)        return a.pos<b.pos;    return a.speed<b.speed;}long long lowbit(long long x){    return x&(-x);}void update(long long x){    while(x<=n)    {        c[x]+=1;        x+=lowbit(x);    }}long long getsum(long long x){    long long sum=0;    while(x>0)    {        sum+=c[x];        x-=lowbit(x);    }    return sum;}int main(){    while(scanf("%d",&n)==1)    {        memset(c,0,sizeof(c));        for(long long i=1; i<=n; i++)        {            scanf("%lld%lld",&x[i].pos,&x[i].speed);        }        sort(x+1,x+1+n,cmp);        for(long long i=1;i<=n;i++)        {            y[i].pos=i;            y[i].speed=x[i].speed;        }        sort(y+1,y+1+n,cmp1);        long long res=0;        for(long long i=1; i<=n; i++)        {            a[y[i].pos]=i;        }        for(int i=1; i<=n; i++)        {            update(a[i]);            res+=(i-getsum(a[i]));        }        printf("%lld\n",res);    }}


原创粉丝点击