求逆序对。其实,就是求交点。利用了归并排序的稳定性。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
class node
{
public:
int ly,ry;
int num;
};
node date[30005],temp[30005];
int ans=0;
int cmp(const void *a,const void *b)
{
return (*(node *)a).ry >(*(node *)b).ry ?1:-1;
}
int n;
void mergesort(int left,int mid,int right,node a[])
{
int k=0,i=left,j=mid+1;
while(i<=mid&&j<=right)
{
if(a[i].ly >a[j].ly )
{
ans+=(mid-i+1);//此处注意。
temp[k]=a[j++];
}
else temp[k]=a[i++];
k++;
}
while(i<=mid)
temp[k++]=a[i++];
while(j<=right)
temp[k++]=a[j++];
for(i=left;i<=right;i++)
a[i]=temp[i-left];
}
void merge(int left,int right,node a[])
{
if(left==right) return ;
int mid=(left+right)/2;
merge(left,mid,a);
merge(mid+1,right,a);
mergesort(left,mid,right,a);
}
void solve()
{
if(n==0){ printf("1\n"); return ;}
qsort(date+1,n,sizeof(date[0]),cmp);
for(int i=0;i<n;i++)
date[i].num=i;
ans=n+1;
merge(1,n,date);
printf("%d\n",ans);
}
int main()
{
int l,r;
while(scanf("%d%d",&l,&r)!=EOF)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int k,b;
scanf("%d%d",&k,&b);
date[i].ly = k*l+b;
date[i].ry = k*r+b;
}
solve();
}
return 0;
}