#1686 : 互补二元组
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定N个整数二元组(X1, Y1), (X2, Y2), ... (XN, YN)。
请你计算其中有多少对二元组(Xi, Yi)和(Xj, Yj)满足Xi + Xj = Yi + Yj且i < j。
输入
第一行包含一个整数N。
以下N行每行两个整数Xi和Yi。
对于70%的数据,1 ≤ N ≤ 1000
对于100%的数据,1 ≤ N ≤ 100000 -1000000 ≤ Xi, Yi ≤ 1000000
输出
一个整数表示答案。
- 样例输入
-
5 9 10 1 3 5 5 5 4 8 6
- 样例输出
-
2
分析:Xi+Xj=Yi+Yj等价于(Xi-Yi)+(Xj-Yj)=0,即横坐标与纵坐标之差为相反数。
开数组统计即可。#include<cstdio> long long a[20000010]; int main() { int N,x,y; scanf("%d",&N); int T=10000000;//0映射为T for(int i=0;i<N;i++) { scanf("%d%d",&x,&y); a[x-y+T]++; } long long ans=0; for(int i=1;i<10000000;i++) ans+=a[i+T]*a[T-i]; if(a[T]>=1)//0的相反数为0 { long long temp=a[T]*(a[T]-1)/2; ans+=temp; } printf("%lld\n",ans); return 0; }