Problem

原题链接

Meaning

求曼哈顿距离和欧氏距离相等的坐标组数量。

Solution

这道题用枚举复杂度较高,我们考虑探究当两点的曼哈顿距离与欧氏距离相等时,它们横纵坐标的关系。

如下图所示,\(MO\) 与 \(ON\) 长度之和为 \(M\) 和 \(N\) 两点间的曼哈顿距离,\(MN\) 的长度则为两点间的欧氏距离。此时,在 \(Rt\bigtriangleup MON\) 中,\(MO+ON>MN\),不符合题意。

所以,当 \(Rt\bigtriangleup MON\) 不存在,即 \(MN\) 与坐标轴平行时,\(MO+ON=MN\),此时,有 \(M\) 与 \(N\) 的横坐标或纵坐标相等。

我们也可以通过两种距离的计算公式推出这个结论。

设 \(M(x_i,y_i)\),\(N(x_j,y_j)\)。

当 \(|x_i-x_j|+|y_i-y_j|=\sqrt{(x_i-x_j)^2+(y_i-y_j)^2}\) 时,

等式两边平方,得 \((x_i-x_j)^2+2|x_i-x_j||y_i-y_j|+(y_i-y_j)^2=(x_i-x_j)^2+(y_i-y_j)^2\)。

移项,合并同类项得 \(2|x_i-x_j||y_i-y_j|=0\)。

从而有 \(|x_i-x_j|=0\) 或 \(|y_i-y_j|=0\)。

即 \(x_i=x_j\) 或 \(y_i=y_j\),得证。

所以,我们可以分别记录相同的横坐标出现的次数和相同的纵坐标出现的次数,若某个横坐标或纵坐标出现了 \(k\) 次,那么每两次都可以组成一对,总数应加上 \(C_{k}^{2}=\frac{k!}{2!(k-2)!}=\frac{k(k-1)}{2}\)。

但通过阅读样例 \(2\),可以发现有相同的点出现,导致我们在累加时将横纵坐标都相等的这些点计了两次,需要排掉一次。设对于某个位置上有 \(q\) 个这样的点,我们应该减去一次这些点两两组合成的坐标组数,即减去 \(C_{q}^{2}=\frac{q!}{2!(q-2)!}=\frac{q(q-1)}{2}\)。

Code

通过三个映射表分别维护每个横坐标出现次数,每个纵坐标出现次数和每个位置上的重点数。

注意开 long long

Code
#include<bits/stdc++.h>
using namespace std;
long long n,ans;
map<long long,long long> xeql,yeql;
map<pair<long long,long long>,long long> alleql;
long long f(long long x){
return (x*(x-1))/2;
}
int main(){
long long temx,temy;
scanf("%lld",&n);
for(int i=1;i<=n;++i){
scanf("%lld%lld",&temx,&temy);
++xeql[temx];
++yeql[temy];
++alleql[{temx,temy}];
}
map<long long,long long>::iterator iter1;
map<pair<long long,long long>,long long>::iterator iter2;
for(iter1=xeql.begin();iter1!=xeql.end();++iter1) ans+=f(iter1->second);
for(iter1=yeql.begin();iter1!=yeql.end();++iter1) ans+=f(iter1->second);
for(iter2=alleql.begin();iter2!=alleql.end();++iter2) ans-=f(iter2->second);
printf("%lld",ans);
return 0;
}

CF650A 题解的更多相关文章

  1. CF650A Watchmen(STL+map)

    目录 CF650A Watchmen 1. 手推公式 2.算法 3.优化 4.补充 CF650A Watchmen 只有三个map的一篇题解 1. 手推公式 \(|x2-x1|+|y2-y1|=\sq ...

  2. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  3. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  4. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  5. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  6. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  7. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  9. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  10. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. Linux性能分析-平均负载

    平均负载的理解 一般系统变慢时,我们会使用top或uptime命令来查看下系统的负载情况 [root@localhost shell]# uptime 13:51:08 up 5 days, 21:5 ...

  2. 【Ubuntu】安装OpenSSH启用远程连接

    [Ubuntu]安装OpenSSH启用远程连接 零.安装软件 使用如下代码安装OpenSSH服务端: sudo apt install openssh-server 壹.启动服务 使用如下代码启动Op ...

  3. unigui显示uniTreeVview使用TUniTreeNode内存泄漏的问题【14】

    uniTreeVviewc创建一个tree,显示患者姓名(PatientName).因为需要用到患者ID(PatientID),所以使用help: TPatientTreeNode = class(T ...

  4. 扫盲ASM

    在进行程序跟踪时,会出现汇编.由于ASM盲,所以添加不少烦恼.有烦恼得想办法解决.对,扫盲ASM. 这里是教材,感觉大白话很好理解(感谢 http://www.ruanyifeng.com/blog/ ...

  5. 思绪碎片:一个INFP的自我对话

    ## 关于存在与意义 > "我写一些东西,不是为了让别人看见,而是为了未来的我." -- 阮一峰 - 未知带来的心慌持续蔓延 - **根本症结**:自身的弱小,无法坦然面对生 ...

  6. Windows与Linux通过Samba共享文件夹

    Ubuntu系统,按如下步骤执行: 1.安装samba服务 sudo apt update sudo apt install samba -y 2.创建共享目录 sudo mkdir -p /home ...

  7. 关于Bevy中的原型Archetypes

    认识Bevy中的原型 Bevy是基于ECS(Entity-Component-System)架构的游戏引擎,其中的Entity实体是游戏中的一个基本对象,但实体本身通常只是一个标识id,它不包含任何具 ...

  8. Java编程--委派设计模式

    目录 委派设计模式 委派 (Delegation) 委派设计模式 委派 (Delegation) 委派(Delegation)是一种设计模式,通常用于实现代码的解耦和复用.简单来说,委派是指一个对象将 ...

  9. Java5新特性--可变参数

    可变参数 public class Test01 { public static void main(String[] args) { System.out.println(add(123)); Sy ...

  10. 【记录】Python爬虫|爬取空间PC版日志模板

    目录 效果 运行结果 模板中免费的部分 损坏的模板 小彩蛋 代码 问题及解决方式 1. 返回数据_callback({})而非json 2. 获取封面图链接 注:2021/7/30做 效果 运行结果 ...