《哈希表》K倍区间(解题报告)

文章目录

    • 零、题目描述
    • 一、算法概述
    • 二、算法思路
    • 三、代码实现
    • 四、算法解释
    • 五、复杂度分析

零、题目描述

题目链接:K倍区间
在这里插入图片描述

一、算法概述

  计算子数组和能被k整除的子数组数量的算法。通过前缀和与哈希表的结合,高效地统计满足条件的子数组。
  需要注意的是,题目要求求的是 k 的非负整数倍,而非整数倍,所以哈希表的值光存储次数是不够的,需要维护一个列表,在枚举到第 i 个元素的时候,在哈希表 hashset[ sum[i]%k ] 的所有列表元素中,统计小于等于 sum[i] 的元素个数进行累加,因为只有小于等于 sum[i] 的值才能保证是 非负整数 倍。

二、算法思路

  1. 前缀和数组:计算数组的前缀和数组sum,其中sum[i]表示前i个元素的和。
  2. 哈希表与多重集合:使用哈希表hashset,键为前缀和模k的余数,值为对应的前缀和的多重集合。
  3. 余数处理:对于每个前缀和sum[i],计算其模k的余数s,并处理可能的负数余数情况。
  4. 查询与统计:在哈希表中查找余数为s的前缀和集合,并统计其中小于当前前缀和的元素数量,累加到结果中。
  5. 更新哈希表:将当前前缀和插入到对应的余数集合中。

三、代码实现

#include <iostream>
#include <unordered_map>
#include <set>
using namespace std;
long long sum[100001];int main()
{int n, k;cin >> n >> k;for(int i = 1; i <= n; ++i) {int x;cin >> x;sum[i] = sum[i-1] + x;}long long ans = 0;unordered_map<int, multiset<long long> > hashset;hashset[0].insert(0);for(int i = 1; i <= n; ++i) {int s = sum[i] % k;s = (s + k) % k;int cnt = distance(hashset[s].begin(),hashset[s].upper_bound(sum[i]));ans += cnt;hashset[s].insert(sum[i]);}cout << ans << endl;return 0;
}

四、算法解释

  1. 输入处理:读取数组长度n和除数k,然后读取数组元素并计算前缀和数组。
  2. 初始化:初始化结果变量ans0,并在哈希表中插入初始值(0, 0),处理空数组的情况。
  3. 遍历前缀和数组
    • 计算当前前缀和模k的余数s,并处理负数余数。
    • 在哈希表中查找余数为s的前缀和集合,统计其中小于当前前缀和的元素数量(注意注意!这题的核心在这里,要求的是非负整数倍,所以必须要找集合中 小于 当前 sum[i] 的元素值,利用二分去找hashset[s].upper_bound(sum[i]))。
    • 将当前前缀和插入到对应的余数集合中。
  4. 输出结果:输出满足条件的子数组数量。

五、复杂度分析

  1. 时间复杂度:随机数据是 O ( n l o g n ) O(n log n) O(nlogn) 的,如果可以构造数据,会达到 O ( n 2 ) O(n^2) O(n2),本题数据较弱。
  2. 空间复杂度 O ( n ) O(n) O(n)。主要用于存储前缀和数组和哈希表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84874.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenShift 在 Kubernetes 多出的功能中,哪些开源?

OpenShift 在 Kubernetes 基础上增加的功能中&#xff0c;部分组件是开源的&#xff08;代码可公开访问&#xff09;&#xff0c;而另一些则是 Red Hat 专有&#xff08;闭源&#xff09;。以下是详细分类&#xff1a; 1. 完全开源的功能&#xff08;代码可查&#xff09; 这些…

【每天一个知识点】CITE-seq 技术

一、技术背景 单细胞RNA测序&#xff08;scRNA-seq&#xff09;自问世以来&#xff0c;极大推动了细胞异质性和组织复杂性的研究。但RNA水平并不能完全代表蛋白质水平&#xff0c;因为蛋白质的表达受转录后调控、翻译效率及蛋白降解等多种因素影响。此外&#xff0c;许多细胞类…

中文Windows系统下程序输出重定向乱码问题解决方案

导言 最近我在用 Rust 开发时&#xff0c;遇到了一个让人头疼的问题&#xff1a;运行 cargo run -- version Cargo.toml > output.txt 将输出重定向到文件后&#xff0c;打开 output.txt 却发现里面全是乱码&#xff01;我的程序确实是UTF8但是输出的文件却是UTF16LE编码的…

Python管理工具UV

常用 UV 命令 安装 pip install uv 版本相关 uv python list 打印所有uv支持的python版本uv python install cpython-3.12 安装指定的python版本uv run -p 3.12 test.py 用指定的python版本运行python代码uv run -p 3.12 python 进入python执行环境。假如输入的版本是一个本…

论文略读:ASurvey on Intent-aware Recommender Systems

202406 arxiv 推荐系统在许多现代在线服务中发挥着关键作用&#xff0c;例如电子商务或媒体流服务&#xff0c;它们能够为消费者和服务提供商创造巨大的价值。因此&#xff0c;过去几十年来&#xff0c;研究人员提出了大量生成个性化推荐的技术方法。传统算法——从早期的 Gro…

Neo4j 中存储和查询数组数据的完整指南

Neo4j 中存储和查询数组数据的完整指南 图形数据库 Neo4j 不仅擅长处理节点和关系&#xff0c;还提供了强大的数组(Array)存储和操作能力。本文将全面介绍如何在 Neo4j 中高效地使用数组&#xff0c;包括存储、查询、优化以及实际应用场景。 数组在 Neo4j 中的基本使用 数组…

Android 编译和打包image镜像流程

1. 编译命令 source build/envsetup.sh lunch aosp_car_arm64-userdebug make2. 编译流程 source build/envsetup.sh 定义一些函数的环境变量&#xff0c;如 lunchvalidate_current_shell&#xff0c;确认 shell 环境set_global_paths&#xff0c;设置环境变量 ANDROID_GLOB…

MySQL:SQL 慢查询优化的技术指南

1、简述 在 Java 后端开发中&#xff0c;数据库是系统性能瓶颈的高发地带&#xff0c;而 慢 SQL 查询 往往是系统响应迟缓的“罪魁祸首”。本文将全面梳理慢 SQL 的优化思路&#xff0c;并结合 Java 示例进行实战演练。 2、慢查询的常见表现 慢查询通常表现为&#xff1a; 接…

leetcode543-二叉树的直径

leetcode 543 思路 路径长度计算&#xff1a;任意两个节点之间的路径长度&#xff0c;等于它们的最低公共祖先到它们各自的深度之和递归遍历&#xff1a;通过后序遍历&#xff08;左右根&#xff09;计算每个节点的左右子树深度&#xff0c;并更新全局最大直径深度与直径的关…

详解main的参数并实现读取文件

在 C 语言中&#xff0c;main函数的参数argc和argv用于接收命令行传入的参数 main 函数的两个参数 int main(int argc, char* argv[]) 假设顾客通过手机 APP 点餐&#xff0c;订单信息会被传递给餐厅的处理系统&#xff08;也就是你的程序&#xff09;。 订单信息结构 argc…

c++IO类

概述 c不直接处理输入输出&#xff0c;而是通过定义在标准类库中的类来处理IO。这些类支持从设备读取数据&#xff0c;向设备写入数据的IO操作&#xff0c;设备可以是文件、控制台窗口等。还可以从内存IO。 IO类 iostream: istream&#xff0c;wistreamostream&#xff0c;wo…

springboot的后端处理HTML的页面请求

下面是一个完整的 Spring Boot 后端示例&#xff0c;用于接收 <form> 提交的文件上传请求&#xff08;/article/uploadLifeImage 接口&#xff09;&#xff0c;并将上传的文件保存到本地目录。 ✅ 一、项目结构 upload-demo/ ├── src/ │ └── main/ │ ├…

深入探究 Go 语言中使用 SQLite 数据库

引言 在软件开发中&#xff0c;数据库是管理和存储数据的关键组件。SQLite 作为一款轻量级的嵌入式数据库&#xff0c;因其零配置、高性能和易于集成等特性&#xff0c;成为众多小型项目和嵌入式系统的理想选择。而 Go 语言以其高效、简洁的特点&#xff0c;为操作 SQLite 数据…

Portable Computer Power Adapter

Portable Computer Power Adapter 笔记本电源适配器&#xff0c;将220伏特的交流电转化直流电 现在的适配器真的体积之大&#xff0c;让我无法理解&#xff0c;本来便携计算机为了方便减少体积重量&#xff0c;现在都倒反天罡了。让我无法理解设计师是怎么干出来的。这玩意有2…

Uniapp 网络请求封装专题

目录 一、前言 二、uniapp官方文档 三、举例演示 3.1 使用说明 3.2 Content-Type 3.2.1 ​​基本概念 ​​3.2.2 核心作用 3.2.3 常见 Content-Type 类型及使用场景 1&#xff09;文本类 a&#xff09;text/plain​​​​ b&#xff09;text/html​​ 2&#xf…

2025年渗透测试面试题总结-2025年HW(护网面试) 07(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年HW(护网面试) 07 一、OWASP Top 10 2023核心漏洞 二、XSS窃取Cookie全流程 三、渗透测试五阶段模型…

Seata分布式事务解决框架

Seata&#xff08;Simple Extensible Autonomous Transaction Architecture&#xff09;是一个开源的分布式事务解决方案&#xff0c;旨在帮助开发者更容易地在微服务架构中解决分布式事务问题。 你可以把它理解为一个工具箱&#xff0c;专门用来处理微服务之间操作的一致性。…

旧物回收小程序开发:开启绿色生活新方式

在环保理念日益深入人心的今天&#xff0c;每一件旧物都承载着资源再生的无限可能。我们精心打造的旧物回收小程序&#xff0c;宛如一把神奇的钥匙&#xff0c;为你开启绿色生活新方式&#xff01; 想象一下&#xff0c;家中堆积如山的旧衣物、闲置的电子产品、废弃的书籍杂志…

STM32 串口通信②:蓝牙模块HC-05控制单片机

一 前言 上一篇我们已经成功实现单片机和电脑的连接&#xff0c;接下来&#xff0c;我们学习一个有趣的板块&#xff0c;HC-05蓝牙模块&#xff0c;这个蓝牙模块&#xff0c;我们就要建立手机和单片机的通讯啦&#xff0c;还是比较有趣的一个过程&#xff0c;大家可以跟着多操作…

【Verilog】Verilator的TestBench该用C++还是SystemC

Verilator的Testbench&#xff08;测试平台&#xff09;主要使用 C 或 SystemC 来编写。这是由Verilator的工作原理决定的&#xff1a;它将你的Verilog/SystemVerilog设计转换成一个C类&#xff0c;因此你需要一个C环境来实例化和驱动这个类。 下面详细说明这两种方式以及如何…