校选拔赛F题

//给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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值