hihoCoder1686
#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; }
作者:ACRykl —— O ever youthful,O ever weeping!
出处:http://www.cnblogs.com/ACRykl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。