POJ 3714 Raid

#include <stdio.h>
#include <math.h>

#define MAX 100001
#define INF (1e+11)

struct POINT{
	double x;
	double y;
	int isAgent;
};

int numOfStationsOrAgents;

POINT pointArray[MAX * 2];
int numOfPoints;
int indexOfPoint;

POINT leftMidPointArray[MAX];
int numOfLeftMidPoints;
int indexOfLeftMidPoint;

POINT rightMidPointArray[MAX];
int numOfRightMidPoints;
int indexOfRightMidPoint;

void pointCopy(POINT *to, POINT *from){
	to->x = from->x;
	to->y = from->y;
	to->isAgent = from->isAgent;
}
void sortPointsAccordingToX(int start, int end){
	if (start >= end){
		return;
	}

	while (start < end){
		int left = start;
		int right = end;
		POINT pivotPoint;
		pointCopy(&pivotPoint, &pointArray[start]);
		double pivotX = pivotPoint.x;
		while (left < right){
			while (left < right && pointArray[right].x >= pivotX){
				right--;
			}
			pointCopy(&pointArray[left], &pointArray[right]);
			while (left < right && pointArray[left].x <= pivotX){
				left++;
			}
			pointCopy(&pointArray[right], &pointArray[left]);
		}
		pointCopy(&pointArray[left], &pivotPoint);
		int pivot = left;
		sortPointsAccordingToX(start, pivot - 1);
		start = pivot + 1;
	}	
}

double getDist(POINT from, POINT to){
	if (from.isAgent == to.isAgent){
		return INF;
	}
	double deltaX = from.x - to.x;
	double deltaY = from.y - to.y;
	return sqrt(deltaX * deltaX + deltaY * deltaY);
}
double getMinDist(int left, int right){
	double minDist = INF;
	if (left == right){
		return minDist;
	}
	if (left + 1 == right){
		return getDist(pointArray[left], pointArray[right]);
	}

	int mid = (left + right) >> 1;
	double leftMinDistSquare = getMinDist(left, mid);
	double rightMinDistSquare = getMinDist(mid + 1, right);
	minDist= (leftMinDistSquare < rightMinDistSquare ? leftMinDistSquare : rightMinDistSquare);

	numOfLeftMidPoints = 0;
	for (indexOfPoint = mid; indexOfPoint >= left; indexOfPoint--){
		double deltaX = pointArray[mid].x - pointArray[indexOfPoint].x;
		if ( deltaX < minDist){
			++numOfLeftMidPoints;
			pointCopy(&leftMidPointArray[numOfLeftMidPoints], &pointArray[indexOfPoint]);
		}
	}
	numOfRightMidPoints = 0;
	for (indexOfPoint = mid; indexOfPoint <= right; indexOfPoint++){
		double deltaX = pointArray[indexOfPoint].x - pointArray[mid].x;
		if ( deltaX < minDist){
			++numOfRightMidPoints;
			pointCopy(&rightMidPointArray[numOfRightMidPoints], &pointArray[indexOfPoint]);
		}
	}
	
	for (indexOfLeftMidPoint = 1; indexOfLeftMidPoint <= numOfLeftMidPoints; indexOfLeftMidPoint++){
		for (indexOfRightMidPoint = 1; indexOfRightMidPoint <= numOfRightMidPoints; indexOfRightMidPoint++){
			double dist = getDist( leftMidPointArray[indexOfLeftMidPoint], rightMidPointArray[indexOfRightMidPoint]);
			if (dist < minDist){
				minDist = dist;
			}
		}
	}

	return minDist;
}

int main(){
	//freopen("input.txt", "r", stdin);

	int numOfTestCases;
	scanf("%d", &numOfTestCases);
	while (numOfTestCases--){
		scanf("%d", &numOfStationsOrAgents);
		numOfPoints = numOfStationsOrAgents * 2;
		for (indexOfPoint = 1; indexOfPoint <= numOfStationsOrAgents; indexOfPoint++){
			scanf("%lf %lf", &pointArray[indexOfPoint].x, &pointArray[indexOfPoint].y);
			pointArray[indexOfPoint].isAgent = 0;
		}
		for (  ; indexOfPoint <= numOfPoints; indexOfPoint++){
			scanf("%lf %lf", &pointArray[indexOfPoint].x, &pointArray[indexOfPoint].y);
			pointArray[indexOfPoint].isAgent = 1;
		}

		sortPointsAccordingToX(1, numOfPoints);

		printf("%.3f\n", getMinDist(1, numOfPoints) );	
		
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值