我爲汕頭大學OJ出的題目-Reverse Points

Reverse Points

Time limit: 1 Seconds  Memory limit: 32768 Kb  
Total Submit: 116   Accepted Submit: 24   

Description

We know Doctor Sun is very interested in geometry problems. Now he is fascinated by such a problem: On Cartesian plane, if two points (x1,y1) and (x2,y2) have the property that x1<x2 and y1>y2, we call them a pair of “Reverse Points”. Now given N points on the plane, calculate how many pairs of “Reverse Points” are among them. In his opinion, it is an interesting problem but not a hard problem. So he wants to ask you to write a program and solve it. Can you?

In this problem, you can assume that no two points have the same x- coordinate or y-coordinate.

Input

The input consists of a series of data sets. Each data set begins with a line containing an integer N (N<=50000), which indicates the number of points in the data set. N lines describing the coordinates of the points follow it. Each of the N lines has two integers X and Y, describing the x- and y-coordinates of a point, respectively. You must process to the end of file.

Output

For each data set, you must output the number of pairs of “Reverse Points”. No other characters including leading and trailing spaces should be printed.

Sample Input

2
1 2
2 1

Sample Output

1

Author: Hong Sun, ACM/ICPC team member of SCUT
Conner: Jianquan Liu, Coach Assistant of STU

Algorithm:

直接計算的複雜度是O(N^2),不可取。應先對點按x大小排序,然後分治,對點按y大小歸併排序,同時統計。

下面是我的代碼:

//by Sun Hong;  May 4th,2005
//Algorithm--Divide and Conquer,complexity--O(N*logN)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const int maxn=50000;
typedef struct
{
 int x,y;
}Tpoint;
Tpoint p[maxn],tp[maxn];
int N,ans;

int cmp_x(const void *t1,const void *t2)
{
 Tpoint *a,*b;
 a=(Tpoint*)t1; b=(Tpoint*)t2;
 return a->x-b->x;
}
void swap(Tpoint &a,Tpoint &b)
{
 Tpoint temp;
 temp=a; a=b; b=temp;
}
void MergeSort(int left,int right)
{
 int mid,i,j,k;
 mid=(left+right)/2;
 if (right-left<=1)
 {
  if (p[left].y>p[right].y)
  {
   ans++; swap(p[left],p[right]);
  }
  return;
 }
 MergeSort(left,mid); MergeSort(mid+1,right);
 i=mid; j=right; k=right-left;
 while (i>=left && j>mid)
 {
  if (p[i].y>p[j].y){
   ans+=j-mid; tp[k--]=p[i--];
  }else
   tp[k--]=p[j--];
 }
 while (i>=left) tp[k--]=p[i--];
 while (j>mid) tp[k--]=p[j--];
 memcpy(p+left,tp,(right-left+1)*sizeof(Tpoint));
}
int main()
{
 int i;
 //freopen("points.in","r",stdin);
 //freopen("points.out","w",stdout);
 while (1==scanf("%d",&N))
 {
  for (i=0;i<N;i++) scanf("%d%d",&p[i].x,&p[i].y);
  qsort(p,N,sizeof(Tpoint),cmp_x);
  ans=0;
  MergeSort(0,N-1);
  printf("%d/n",ans);
 }
 return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章