C1C2. Power Transmission (gcd离散化边)

https://codeforces.com/contest/1163/problem/C1

题意:给出二维平面上的至多1000个点,求两两连边后,相互相交的边的对数。

 

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using pii = pair<int, int>;
#define x first
#define y second

const int N = 1005;

int n, x[N], y[N];
set<tuple<int, int, int>> ss;
map<tuple<int, int>, ll> mp;

int main() {
	scanf("%d", &n);
	for(int i = 0; i < n; i++) {
		scanf("%d%d", x + i, y + i);
		for(int j = 0; j < i; j++) {
			pii p = pii(x[i], y[i]);
			pii q = pii(x[j], y[j]);
			if(p > q) swap(p, q);
			int a = q.x - p.x;
			int b = q.y - p.y;
			int g = __gcd(a, b);
			a /= g;
			b /= g;
			int c = b * p.x - a * p.y;
			ss.insert(tie(a, b, c));
		}
	}
	ll r = ss.size();
	r = r * (r - 1) / 2;
	for(auto i : ss) {	
		int x, y;
		tie(x, y, ignore) = i;
		mp[tie(x, y)]++;
	}
	for(auto i : mp) r -= i.y * (i.y - 1) / 2;
	printf("%lld\n", r);
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值