题目连接: Managing Difficulties

题目: 略

大致题意:

t组输入, 每组给你n个数字, 问你这n个数字中能找出多少个等差三元组.

解题思路:

假设有下标为 i, j, k(i < j < k)的三个元素满足题意, 那么由等差队列的性质我们可知, 2a[j] = a[i] + a[k]

得出 a[i] = 2a[j] - a[k]

至此, 我们发现我们只需要不断枚举a[j]和a[k]即可通过公式找出对应的a[i].

最后就涉及到存储数据问题了, 由于数字的范围可达1E9 (实际我发现只有1E6的数据), 如果1E9直接用数组存储是开不下的, 这时就会想到用map存储, 算一下复杂度 大约是n2logn, 是可以接受的.

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2E3 + 10;
int a[MAXN]; //存数字
map<int, int> m;
int main()
{int t; scanf("%d", &t);while (t--) {m.clear();int n; scanf("%d", &n);for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);int res = 0; m[a[1]] = 1; //中间元素不可能是第一个, 可以直接跳过第一个元素的情况for (int i = 2; i <= n - 1; ++i) { //枚举中间元素a[j]for (int j = i + 1; j <= n; ++j) { //枚举a[k]int ak = 2 * a[i] - a[j]; //求a[i]if (ak < 0 || !m.count(ak)) continue; //m.count()很关键, 此句记为*res += m[ak]; //记录结果}m[a[i]]++; //把a[j]记录为出现过的元素}printf("%d\n", res);}return 0;
}

关于这道题, 我看别的大佬用unordered_map做的, 说如果用普通的map会卡时间, 这里来说明一下, 并且解释一下 * 处:

关于map容器的count()函数作用:

可以以复杂度logn来得到当前map容器中是否存在该元素.

此时你可能想问, 如果我直接判断m[index]==0不也可以吗? 但是二者最重要的区别就是, 如果你以后者进行判断, 如果容器中本身没有index元素, 则会添加上index元素, 这样会增大容器的存储数据, 从而导致超时, 而count函数则不会. 因此如果在*处没有用count()函数, 而是直接 进行res+=m[ak]的操作, 虽然结果不会有影响, 但是会大大降低后续容器的查找效率.

关于unordered_map:

对这个题而言, 的确用unordered_map要比普通的map快, 特别是如果也运用了count函数则会更快, 大约快了近一倍(都用count函数的情况下).

END

Managing Difficulties(map容器)相关推荐

  1. Map容器大小影响key的索引

    单元测试偶然发现的Map一个问题 Map<String,String> map1 = new HashMap<>();map1.put("aaa", &qu ...

  2. CSU 1113 Updating a Dictionary(map容器应用)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1113 解题报告:输入两个字符串,第一个是原来的字典,第二个是新字典,字典中的元素的格式为 ...

  3. C++中map容器的说明和使用技巧

    C++中map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值. 1   头文件 #include <map> 2   定义 map< ...

  4. HDU 2094 产生冠军 (map容器)

    title: 产生冠军 杭电 2094 tags: [acm,stl] 题目链接 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则 ...

  5. leetcode(3)——697. 数组的度(C++版本注释)(map容器),448. 找到所有数组中消失的数字(取余操作,C++中的auto类型)

    文章目录 前言 697 程序 思路 收获 map容器 448 程序 收获 取模操作的思考 auto 前言 大佬的程序,边刷边总结边学语言. 题目697 697 程序 class Solution {p ...

  6. c++ map 修改value_C++知识分享之STL容器:set 容器与 map 容器的简单应用

    set容器中一些函数,取自百度其他大佬已总结好的,如有侵权,请联系删除! set的各成员函数列表如下: c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器 c++ stl容 ...

  7. C++map容器遍历删除:cannot increment value-initialized map/set iterator

    今天写C++结课作业遇到一个遍历删除的bug: 原代码: for(it=imap.begin();it!=imap.end();it++) imap.erase(it) 运行后: 第一次循环末尾,it ...

  8. map容器中删除一个元素(value)

    一:问题描述 我们想要删除map容器中,一个key值对应的vlaue 二:上码 #include<iostream> #include<map> #include<vec ...

  9. map容器的使用 逆序遍历map容器当中的数据

    一:前言 这个逆序遍历是将map容器的迭代器进行了变化,reverse_iterator逆向遍历的迭代器 ,它需要 rbegin()和rend()方法指出反向遍历的 起始位置和终止位置. 二:上码演示 ...

最新文章

  1. Python使用matplotlib可视化散点图、使用seaborn中的lmplot函数可视化不同分组散点图的最优线性回归拟合曲线(Scatter plot with regression line)
  2. 福田车载无线充电器方案开发设计_过年自驾回家,带上优胜仕车载无线充电器,一放即充导航无忧...
  3. post、get的区别
  4. Jenkins2021持续部署
  5. PHP 算法之 -- 计算器设计
  6. nmap配合shell使用
  7. 福州java培训哪里好_南通java培训哪家好
  8. (pytorch-深度学习)批量归一化
  9. java声明arraylist,在java构造函数中声明ArrayList
  10. 功能强大!IntelliJ IDEA 2022.1正式发布
  11. python计时器程序设计总框图_怎么用python编写计时器?这个编程的方法你一定不要错过...
  12. Android用户界面 UI组件--TextView及其子类(二) Button,selector选择器,sharp属性
  13. C语言基础篇(零)gcc编译和预处理
  14. JAVA容器_java集合容器之Stack
  15. 基于TensorRT完成NanoDet模型部署
  16. android加载框效果《IT蓝豹》
  17. List转Json数组
  18. twaver API笔记
  19. 移动的 ipcam 视频无处不在
  20. 合并的表格怎么加横线_如何在excel中文字后面加横线

热门文章

  1. 基于ASP的勤工俭学管理系统
  2. 基于c语言Easyx库的捕鱼达人小游戏
  3. 深度解析微信生态下8000万中老年网民的电商创新机会
  4. SATA学习笔记 6 ---SATA Primitives(原语)与完整传输实例
  5. scyllaDb在centos8上试用
  6. springBoot餐厅店内点餐系统点餐外卖配送餐馆饭店收银系统实现记录一下「源码文档实过程]
  7. linux 网卡天启与关闭,手把手教你Linux关闭防火墙命令
  8. 项目管理中的一点沟通心得
  9. 修改whmcs首页模板
  10. 第三次作业 大学生旅游调查问卷统计分析报告