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. 【JDBC第7章】DAO及相关实现类

    第7章:DAO及相关实现类 DAO:Data Access Object访问数据信息的类和接口,包括了对数据的CRUD(Create.Retrival.Update.Delete),而不包含任何业务相 ...

  2. 【Docker】常用服务镜像安装

    Docker常用安装 总体步骤 搜索镜像:docker search xxx 拉取镜像:docker pull xxx 查看镜像:docker images 启动镜像:docker run xxx 停 ...

  3. datasnap的restful服务器

    说真话,这玩意真的简单好用.但你要控制好: 1.内存泄漏和异常处理好: 2.有没有发现,通过服务器对数据库进行读写时,在资源管理器中,如果是sql server,就会看到连接1433的连接一直挂在那里 ...

  4. AI团队比单打独斗强!CrewAI多智能体协作系统开发踩坑全解析

    AI团队比单打独斗强!CrewAI多智能体协作系统开发踩坑全解析 阅读时间: 5分钟 | 字数: 1500+ "你是否曾为单个大模型难以解决复杂专业问题而苦恼?是否想过,如果能像组建专业团队 ...

  5. GitOps

    什么是GitOps 持续的GitOps,新时代的DevOps实践,通过Kubernetes集群来实现基于git的全自动化的流程来提高交付速度.简单地说,GitOps是使用Git拉请求管理基础设施部署和 ...

  6. 云备份技术解析:云容灾 CT-CDR 关键技术介绍

    本文分享自天翼云开发者社区<云备份技术解析:云容灾 CT-CDR 关键技术介绍>,作者:沈****军 1.CDP+存储快照,实现秒级RPO (1)CDP技术:云容灾CT-CDR(Cloud ...

  7. MySQL 的 Change Buffer 是什么?它有什么作用?

    MySQL 的 Change Buffer 1. 什么是 Change Buffer? Change Buffer 是 MySQL InnoDB 存储引擎中的一个优化机制,用于减少磁盘 I/O 操作. ...

  8. Java编程之面向对象

    一.面向对象 1.定义 (1)类:描述的是具有共性的一类事物 (2)对象:一个个具备了类的特点和功能的个体 (3)面向对象:要完成某件事,首先要先有对象,然后直接调用这个对象的响应功能 2.成员变量: ...

  9. 在 Go 语言中,构造一个并发安全的 map 集合

    Map 集合是 Go 中提供的一个 KV 结构的数据类型,对它的操作在实际的开发中应该是非常多的,不过它不是一个线程安全的. 1 .Map 不是线程安全的 编写下面的测试代码: func TestUn ...

  10. 我也来说说经典面试题目-“OOM异常会导致JVM退出吗?”

    经典面试题目"OOM异常会导致JVM退出吗? 我的回答是"这要分情况看,对于守护线程来说,OOM并不会导致JVM退出:对于非守护线程来说,如果某个线程捕获了OOM异常并正确进行了处 ...