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;
}
View Code

 










posted @ 2018-02-13 17:39  ACRykl  阅读(166)  评论(0编辑  收藏  举报