【codeforces 650A】【思维】【容斥】【数学】【求n个点中两种距离相等的点对数】

本文提供了一道Codeforces平台上的题目650A的详细解题思路与代码实现。该题旨在求解给定点集中两点间距离相等的点对数量,通过坐标排序和容斥原理来优化计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【链接】https://codeforces.com/problemset/problem/650/A

【一句话题解】求n个点中两种距离相等的点对数。SX U SY =SX+SY +SX ∩ SY,x,y分别排序,map记录点对,容斥算重

【代码】

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn = 1e6 + 6;
int x[maxn], y[maxn];

int cmp(int a, int b) {
	return a < b;
}
map<int, map<int,int> >mp,vis;

int main() {
	int n;
	while (~scanf("%d", &n)) {
		for (int i = 0; i < n; i++) {
			scanf("%d%d", &x[i], &y[i]);
			mp[x[i]][y[i]]++;
		}
		ll ans = 0;

		for (int i = 0; i < n; i++) {
			if (mp[x[i]][y[i]]>1&&!vis[x[i]][y[i]])ans-= (mp[x[i]][y[i]]-1LL)*(mp[x[i]][y[i]])/2;
			vis[x[i]][y[i]] = 1;
		}
		sort(x, x + n, cmp);
		sort(y, y + n, cmp);
		
		for (ll i = 0; i < n; i++) {
			if (i!=0&&x[i] == x[i - 1])continue;
			ll j = lower_bound(x, x + n, x[i] + 1)-x;
			ans += (j - i - 1LL)*(j - i )/2;
		}
		for (ll i = 0; i < n; i++) {
			if (i!=0&&y[i] == y[i - 1])continue;
			ll j = lower_bound(y, y + n, y[i] + 1) - y;
			ans += (j - i - 1LL)*(j - i )/2;
		}
		cout << ans << endl;
	}
}

/*
3
1 1
7 5
1 5

*/

/*

6
0 0
0 1
0 2
-1 1
0 1
1 1

*/

/*

3
1 2
1 2
1 2

*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值