斜率小于0的连线数量

二维平面上N个点之间共有C(n,2)条连线。求这C(n,2)条线中斜率小于0的线的数量。
二维平面上的一个点,根据对应的X Y坐标可以表示为(X,Y)。例如:(2,3) (3,4) (1,5) (4,6),其中(1,5)同(2,3)(3,4)的连线斜率 < 0,因此斜率小于0的连线数量为2。
Input
第1行:1个数N,N为点的数量(0 <= N <= 50000)
第2 - N + 1行:N个点的坐标,坐标为整数。(0 <= X[i], Y[i] <= 10^9)
Output
输出斜率小于0的连线的数量。(2,3) (2,4)以及(2,3) (3,3)这2种情况不统计在内。
Input示例
4
2 3
3 4
1 5
4 6
Output示例
2
#include <iostream>
#include <algorithm>
using namespace std;

const int MAXN = 5e4 + 5;
typedef long long int ll;
struct Node
{
	int x, y;
};

Node nodes[MAXN];
Node temp[MAXN];
ll result = 0;

bool cmp(const Node &a, const Node &b)
{
	if (a.x == b.x)
	{
		return a.y < b.y;
	}

	return a.x < b.x;
}

void mergeSort(int left, int right)
{
	if (left >= right)
	{
		return;
	}

	int mid = left + (right - left) / 2;
	mergeSort(left, mid);
	mergeSort(mid + 1, right);

	int i = left;
	int j = mid + 1;
	int pos = 0;
	while (i <= mid && j <= right)
	{
		if (nodes[i].y > nodes[j].y)
		{
			result += (mid - i + 1);
			temp[pos].x = nodes[j].x;
			temp[pos].y = nodes[j].y;
			j++;
		}
		else
		{
			temp[pos].x = nodes[i].x;
			temp[pos].y = nodes[i].y;
			i++;
		}
		pos++;
	}

	while (i <= mid)
	{
		temp[pos].x = nodes[i].x;
		temp[pos].y = nodes[i].y;
		pos++;
		i++;
	}

	while (j <= right)
	{
		temp[pos].x = nodes[j].x;
		temp[pos].y = nodes[j].y;
		pos++;
		j++;
	}

	pos = 0;
	for (i = left; i <= right; i++)
	{
		nodes[i].x = temp[pos].x;
		nodes[i].y = temp[pos].y;
		pos++;
	}
}

int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> nodes[i].x >> nodes[i].y;
	}

	sort(nodes, nodes + n, cmp);
	mergeSort(0, n - 1);
	cout << result << endl;

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值