IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++ map 与unordered_map 与set 的比较 -> 正文阅读

[C++知识库]c++ map 与unordered_map 与set 的比较

map:红黑树,查找速度O(log n)稳定 且足够快,有序,
unordered_map:哈希散列表 ,查找速度O(1~M)M为key值长度,由于无序哈希map 的查找速度并不稳定,且空间复杂度更大
所以哈希map不一定比map 好用,有时候需要仔细了解,其实log n 比1也就二大了最多几十倍,哈希map比map快l 那么一点但是如果key值(string类型)过长,有时候就会比map慢很多。
set与unordered_set类比于map与哈希map ,原理相同,但我更倾向用map因为之前碰到一题被set卡了。
接下来讲下今天我wa无数次的题:
关于遍历一个使用for(auto pr :s),而不是去从0开始一直遍历到结束,因为我发现第二种做法浪费时间的同时 空间复杂度巨大,可能是因为一些我没有赋值的key在我一个个遍历时占用了无效的空间。相当于我对我最大开了2e9的空间大小的红黑树。

Educational Codeforces Round 115 (Rated for Div. 2)

C. Delete Two Elements

Monocarp 有一个由 n 个整数组成的数组 a。让我们将 k 表示为这些元素的数学平均值(请注意,k 可能不是整数)。

n 个元素的数组的数学平均值是元素的总和除以这些元素的数量(即总和除以 n)。

Monocarp 想要从 a 中删除两个元素,以便剩余 (n-2) 个元素的数学平均值仍然等于 k。

您的任务是计算位置 [i,j] (i<j) 对的数量,如果删除这些位置上的元素,则剩余 (n-2) 个元素的数学平均值等于 k(即,它等于原始数组 a) 的 n 个元素的数学平均值。

输入
第一行包含一个整数 t (1≤t≤104)——测试用例的数量。

每个测试用例的第一行包含一个整数 n (3≤n≤2?105)——数组中元素的数量。

第二行包含一个整数序列 a1,a2,…,an (0≤ai≤109),其中 ai 是数组的第 i 个元素。

所有测试用例的 n 总和不超过 2?105。

输出
打印一个整数 — 位置对的数量 [i,j] (i<j) 使得如果删除这些位置上的元素,则剩余 (n-2) 个元素的数学平均值等于 k(即,它等于原始数组 a) 的 n 个元素的数学平均值。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <unordered_map>
#include <vector>
#define ll long long 

using namespace std;
const int N = 2e5+5;
int t,n,a;
ll sum,ans;
int main()
{
  scanf("%d",&t);
  while(t--)
  {
      map<int,int>s;
      s.clear();
      sum=0,ans=0;
      scanf("%d",&n);
      for(int i=0;i<n;i++)
      {
          scanf("%d",&a);
          sum+=a;
          s[a]++;
      }
      double avg=1.0*sum/n;
      ll k=avg*2;
      if(k==2*avg)
      {
          ll d=0,ret=0;
       for(auto pr :s)
       {
           int x=pr.first;
           int y=pr.second;
           if(k==2*x)d+=(ll)y*(y-1)/2;
           else ret+=(ll)y*s[k-x];
       }
       printf("%lld\n",ret/2+d);
      }
      else 
      {
          puts("0");
      }
      
  }
  return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 12:32:24  更:2021-11-11 12:33:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:59:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码