CF650A Watchmen


只有三个map的一篇题解


1. 手推公式

\(|x2-x1|+|y2-y1|=\sqrt{(x2-x1)^2+(y2-y1)^2}\)

设|x2-x1|=a,|y2-y1|=b

\(a+b=\sqrt{a^2+b^2}\)

\((a+b)^2=a^2+b^2\)

\(a^2+2ab+b^2=a^2+b^2\)

\(2ab=0\)

\(ab=0\)

\(|x2-x1|*|y2-y1|=0\)

\(|x2-x1|=0\:\:or\:\:|y2-y1|=0\)

\(x1=x2\:\:or\:\:y1=y2\)


2.算法

由公式可知,横纵坐标二选一相同时,两点符合要求

坐标值域很大,可以直接上map

X[]存某行出现过点数,Y[]存某列出现过的点数,p[][]存某个坐标出现过的点数

X[x]+Y[y]-p[x][y]就是答案


3.优化

众所周知,map复杂度是log级的,而unordered_map是O(1)的

所以对于两个下标是int的我们可以用unordered_map代替


4.补充

make_pair(x,y)的意思是将x,y搞成一个pair<,>型东西

以下两段代码等价:

a=make_pair(x,y);
a.first=x;
a.second=y;

(tips.因为CF的c++版本很高,所以要去掉斜杠那两句话,但NOIP中要加上)

#include <bits/stdc++.h>
//#include <tr1/unordered_map>
//using namespace std::tr1;
using namespace std;
unordered_map<int,int> X,Y;
map<pair<int,int>,int> p;
long long ans; //答案会爆int
int n;
signed main(){
scanf("%d",&n);
for(int i=1,x,y;i<=n;i++){
scanf("%d%d",&x,&y);
ans+=X[x]+Y[y]-p[make_pair(x,y)];
X[x]++;
Y[y]++;
p[make_pair(x,y)]++;
}
printf("%I64d",ans);
}

CF650A Watchmen(STL+map)的更多相关文章

  1. stl::map之const函数访问

    如何在const成员数中访问stl::map呢?例如如下代码: string ConfigFileManager::MapQueryItem(const string& name) const ...

  2. hdu4941 Magical Forest (stl map)

    2014多校7最水的题   Magical Forest Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit ...

  3. [CareerCup] 13.2 Compare Hash Table and STL Map 比较哈希表和Map

    13.2 Compare and contrast a hash table and an STL map. How is a hash table implemented? If the numbe ...

  4. STL MAP及字典树在关键字统计中的性能分析

    转载请注明出处:http://blog.csdn.net/mxway/article/details/21321541 在搜索引擎在通常会对关键字出现的次数进行统计,这篇文章分析下使用C++ STL中 ...

  5. POJ 3096 Surprising Strings(STL map string set vector)

    题目:http://poj.org/problem?id=3096 题意:给定一个字符串S,从中找出所有有两个字符组成的子串,每当组成子串的字符之间隔着n字符时,如果没有相同的子串出现,则输出 &qu ...

  6. STL MAP 反序迭代

    ITS_NOTICE_MAP::reverse_iterator it = noticeMap.rbegin(); for ( ; it != noticeMap.rend(); ++it ) { I ...

  7. 泛型Binary Search Tree实现,And和STL map比较的经营业绩

    问题叙述性说明: 1.binary search tree它是一种二进制树的.对于key值.比当前节点左孩子少大于右子. 2.binary search tree不是自平衡树.所以,当插入数据不是非常 ...

  8. Dictionary,hashtable, stl:map有什么异同?

    相同点:字典和map都是泛型,而hashtable不是泛型. 不同点:三者算法都不相同 Hashtable,看名字能想到,它是采用传统的哈希算法:探测散列算法,而字典则采用的是散列拉链算法,效率较高, ...

  9. STL Map和multimap 容器

    STL Map和multimap 容器 map/multimap的简介 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供 基于key的快速检索能力.       ...

随机推荐

  1. JavaScript基础——JavaScript函数(笔记)

    avaScript 函数(笔记) JavaScript 是函数式编程语言,在JavaScript脚本中可以随处看到函数,函数构成了JavaScript源代码的主体. 一.定义函数 定义函数的方法有两种 ...

  2. 24. ClustrixDB 持久性配置文件

    这些持久性选项不适用于内存中的表.有关更多信息,请参见内存表. ClustrixDB提供了一个选项,通过指定如何提交事务并使其持久,从而提高性能.当提交成功通知应用程序时,用户可以在提交过程中指定提交 ...

  3. QT:QSS字体设置

    css,qss font-family常用的黑体宋体等字体中英文对照 当qss使用中文设置字体时,无法生效.因为qss不支持中文设置字体,所以下面给出一些常用的黑体宋体字体中英文对照. 微软雅黑: M ...

  4. try捕获SQL异常

  5. [模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和

    一些基本的定义在这里: [模板] 计算几何1(基础): 点/向量/线/圆/多边形/其他运算 自适应Simpson Simpson's Rule: \[ \int ^b_a f(x)dx\approx ...

  6. [JZOJ6241]【NOI2019模拟2019.6.29】字符串【数据结构】【字符串】

    Description 给出一个长为n的字符串\(S\)和一个长为n的序列\(a\) 定义一个函数\(f(l,r)\)表示子串\(S[l..r]\)的任意两个后缀的最长公共前缀的最大值. 现在有q组询 ...

  7. 两种建立堆的方法HeapInsert & Heapify

    参考 堆排序中两种建堆方法的比较 第一种方法HeapInsert 它可以假定我们事先不知道有多少个元素,通过不断往堆里面插入元素进行调整来构建堆. 它的大致步骤如下: 首先增加堆的长度,在最末尾的地方 ...

  8. Hibernate持久化类规则

    注意事项: 提供无参的构造方法,因为在hibernate需要使用反射生成类的实例 提供私有属性,并对这些属性提供公共的setting和getting方法,因为在hibernate底层会将查询到的数据进 ...

  9. Maven报错,没有有效的生命周期

    [ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a g ...

  10. UIButton设置按钮点击范围大于可视范围

    自定义按钮类型CustomButton,继承UIButton,重写pointInside函数改变点击响应范围. 例如,按钮点击范围比实际高度上下增加6. CustomButton.h @interfa ...