//给N个二维点,求两坐标差值为相反数的点对数
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
int ans=0;//输出答案
map<int,int> ca; //定义映射,first是点差值,second是这个点差有多少个点
int main(){
int n;cin>>n; //N个点
for(int i=1;i<=n;i++){ //遍历
int a,b;cin>>a>>b; //读点
if(ca.find(b-a)==ca.end())ca[b-a]=1;//如果找不到这个映射那么就置为1
else ca[b-a]++; //否则就自增(其实上面那句可以省略,因为默认就是0)
}
map<int,int>::iterator ite; //定义迭代器
for(ite=ca.begin();ite!=ca.end();ite++){//遍历
if(ite->first>=0)break; //如果点差已经扫完负的就可以跳出,因为是对称的
ans+=(ite->second)*(ca[ite->first*(-1)]);//每次答案都累加
}//第一个点差的点数*点差与其相反的点数就是点对数
ans+=ca[0]*(ca[0]-1)/2; //如果有点差为0的,注意求组合数C(N,2)
cout<<ans<<endl; //输出答案
return 0;
}
样例输入
5
9 10
1 3
5 5
5 4
8 6
样例输出
2
校选拔赛F题
最新推荐文章于 2024-01-16 00:01:32 发布