【备战秋招】每日一题:华东师范大学保研机试-2022-差分计数

news2024/12/24 8:28:58

为了更好的阅读体检,可以查看我的算法学习博客差分计数

题目内容

给定n个整数a_1,...,a_n和一个整数x。求有多少有序对(i,j)满足a_i-a_j= x

输入格式

第一行两个整数n(1 \leq n \leq 2 \times 10^6),x(-2 \times 10^6 \leq x \leq 2 \times 10^6),分别代表整数的个数和题目中的x。

第二行n个用空格隔开的整数,第i个代表-2 \times 10^6 \leq a_i \leq 2 \times 10^6

输出格式

一行一个整数,代表满足a_i-a_j= x的有序对(i,j)个数。

样例

input

5 1
1 1 5 4 2

ouput

3

 提示

(i,j) 为(5,1),(5,2),(3,4)

思路

1.双指针暴力法

双重循环枚举i,j 来计数即可,复杂度是O(n^2)。但是无法拿到满分。 服务器一般一秒跑1e8次。

把n带进去看看(2 * 10^6)^2=4 * 10^{12} >> 1e8

2.桶预处理法

先将所有数装进桶中。扫一遍数组枚举每一个a_i, 那么此时已知a_i的数(常数)为a_i,x

a_i-a_j=x


a_j=a_i-x

所以我们的任务就是在整个序列中寻找有多少个a_j满足等式②。由于我们已经预处理了桶。所以直接查询$a_i-x$的出现次数即可。

有一个特殊情况:当x=0 时i = j也可以。但是题目貌似没规定是否可以相等。如果可以相等就不用改,如果不能相等就得特判 - 1

此时复杂度显然就是O(n)的了

实现

​       注意,在实现的过程中还是需要注意很多细节问题。

c++
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 5;
int a[maxn];
int b[maxn * 2]; // 注意:b的下标填的是值域范围,不是数组长度,所以需要开两倍
// 下标变换
int idTrans (int x){
    // 这时下标从[-2e6,2e6]映射到[0,4e6]
    return x + 2e6;
}
int main() {
    int n , x;
    cin >> n >> x;
    for (int i = 1 ; i <= n ; i++)
        cin >> a[i];
    // 第一步:将数装进桶中
    // 可以用STL中的unordered_map,但是我们发现下标其实没那么大
    // 所以为了更快的运行速度我们可以开一个桶数组b。(题目只给了0.5s)
    // 但是值域涉及到负数,所以需要做一个下标的映射.
    for (int i = 1 ; i <= n ; i++){
        b[idTrans(a[i])]++;
    }
    //  第二步:枚举每个数,统计答案
    //  答案可能很大:考虑ai全等且x=0,那么任意两个i,j都是一个答案。那么答案会是n^2阶的。
    //  尝试将其带进去会发现它爆int了,所以只能用long long 存储
    long long ans = 0;
    for (int i = 1 ; i <= n ; i++)
        ans += b[idTrans(a[i] - x)];
    cout << ans << endl;
    return 0;
}

总结

评价

​       本题正式涉及到算法思想,鉴定为竞赛入门难度。

关键

​       这道题的优化关键在于桶预处理

拓展

​       1.将题目中的a_i-a_j= x 改成 a_i-a_j= i-j

​       2.序列中有多少个子段的和恰好为$x$,即求有多少有序对(i,j)i < j满足
\sum_{k=i}^{j}a_k=x
​       3.序列中有多少个子段的和为$x$的倍数,即求有多少有序对(i,j)满足
\sum_{k=i}^{j} a_k \equiv 0 \ (mod\ x)
​       4.序列中有多少个子段的平均值恰好为$x$,即求有多少有序对(i,j)满足
\frac{\sum_{k=i}^{j} a_k}{j-i+1}=x

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

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

相关文章

1745_Perl中的switch结构

全部学习汇总&#xff1a; GreyZhang/perl_basic: some perl basic learning notes. (github.com) 用了很久时间的Perl了&#xff0c;但是一直没有使用过switch结构。即使有的时候&#xff0c;基本上也通过其他的形式完成了相关工作。虽说有时候可能会效率低一些&#xff0c;但…

【Python】使用pyside2时qt designer 设计窗口显示图标icon但是运行后不显示(图文说明)

目录 错误情况解决方法总结 欢迎关注 『Python』 系列&#xff0c;持续更新中 欢迎关注 『Python』 系列&#xff0c;持续更新中 平时用的不多&#xff0c;也不知道这个报错有没有偶然性&#xff0c;或者是我自己搞错了仅供参考。 错误情况 toolBar中的图标在designer中显示正…

【备战秋招】每日一题:华东师范大学保研机试-2022-位运算

为了更好的阅读体检&#xff0c;可以查看我的算法学习博客位运算 题目内容 给定一个int型整数x,将x的二进制表示中第i位和第j位的值互换。 注意: x的二进制表示的最右边为第0位。 输入格式 在一行中输入三个整数&#xff0c;x,i,j, 整数之间用一个空格分隔。 输出格式 在…

【开启微前端新时代】微前端:构建可扩展、可维护的现代 Web 应用

文章目录 第1章&#xff1a;微前端简介微前端是什么微前端的优势和劣势微前端有以下优势1. 独立部署2. 技术栈无关3. 更好的扩展性4. 短生命周期 微前端的劣势&#xff1a;1. 系统复杂度2. 通信机制3. 部署成本 微前端的历史和现状 第2章&#xff1a;微前端架构模式容器和子应用…

软考A计划-网络工程师-系统架构师案例分析知识点整理

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

Linux串口编程

文章目录 前言一、Linux下的TTY体系介绍二、行规层三、Linux串口编程步骤四、代码编写总结 前言 本篇文章将讲解如何在Linux下使用串口。 一、Linux下的TTY体系介绍 在Linux系统中&#xff0c;tty&#xff08;Teletypewriter&#xff09;是指一种终端设备&#xff0c;它提供…

Fiddler之Replay功能详解

今天就先来看看Fiddler的功能。 Fiddler&#xff0c;最容易看到的就是快捷工具栏中的 Replay 按钮 解释下&#xff1a; Reissue the selected requests. 重发选中的请求Hold CTRL to reissue unconditionallly. 选中请求按住 CTRL 键&#xff0c;点击Replay时无条件重发选中…

【MySQL函数】:让你的数据库操作更高效(一)

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL字符串函数和数学函数的讲解✨ 目录 前言一、字符串函数二、数学函数三、总结 一、字符串函数 函数作用UPPER(列|字符串)将字符串每个字符转为大写LOWER(列|字符串)将字符串每个字符转为小写CONCAT(str1,str2,…

CSS的学习2

这几天复习了英语&#xff0c;高数&#xff0c;也考完四级了。 这两天开始写了课设的项目&#xff0c;选的是捷住宝&#xff0c;我打算用链表和搜索树。写着写着总是出问题&#xff0c;然后改Bug。还差删除信息和文件操作&#xff0c;还是尽量写好一些。 明天考英语&#xff…

TX-1C单片机实现多功能电子时钟

实验报告 电子时钟实验 一、实验要求&#xff1a;二、实验结果三、实验思路&#xff08;一&#xff09;模块整理&#xff08;二&#xff09;流程图绘制&#xff08;三&#xff09;C51编程 四、实验总结&#xff08;一&#xff09;未完成的部分&#xff08;二&#xff09;待优化…

layui框架实战案例(22):多附件上传实战开发实录(php后端、文件删除、数据库删除)

layUI框架实战案例系列文章 layui框架实战案例(21)&#xff1a;layui上传的哪些事(layui.upload组件、 file文件域、php后台上传)layui框架实战案例(20)&#xff1a;常用条件判断和信息展示技巧(图片预览、动态表格、短信已读未读、链接分享、信息脱敏、内置框架页)layui框架实…

【Spring Cloud系列】-Eureka服务端高可用详解

【Spring Cloud系列】-Eureka服务端高可用详解 文章目录 【Spring Cloud系列】-Eureka服务端高可用详解一. 序言二. 什么是高可用性三. 什么是CAP一致性&#xff08;Consistency&#xff09;可用性&#xff08;Availability&#xff09;分区容错&#xff08;Partition-toleranc…

2.8 基于DPDK的UDP用户态协议栈实现

目录 一、网络协议栈1、**网络通信过程**2、**dpdk** 二、dpdk环境1、dpdk环境开启2、Windowe下配置IP和MAC地址的映射 三、实现用户态协议栈ustack1、UDP协议2、代码 四、dpdk一些基本函数接口rte_eal_init()rte_pktmbuf_pool_create()rte_socket_id()rte_eth_dev_configure()…

Java连接MySQL对数据实现增删改查

在实现好的窗口实现 添加修改删除查询数据的方法 以如下数据实验 statement自带的函数使用说明execute &#xff08;SQL&#xff09;执行给定的SQL语句返回一个或多个结果结果集 execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组…

Verilog | 基4 booth乘法器

上接乘法器介绍 原理 跟基2的算法一样&#xff0c;假设A和B是乘数和被乘数&#xff0c;且有&#xff1a; A ( a 2 n 1 a 2 n ) a 2 n − 1 a 2 n − 2 … a 1 a 0 ( a − 1 ) B b 2 n − 1 b 2 n − 2 … b 1 b 0 \begin{align}A&(a_{2n1}a_{2n})a_{2n−1}a_{2n−2}……

安卓期末考试知识总结(3)

文章目录 第五章 数据存储文件存储(非重点)内部存储获取或者打开目录操作文件 外部存储区 SharedPreferences存储写入Shared Preferences读取数据 SQLite数据库SQLite数据库的创建操作数据库数据Curosr数据库的事务 第五章 数据存储 简述Android数据存储的方式 Android平台提供…

FreeRTOS:任务通知

目录 一、任务通知简介二、发送任务通知2.1 函数xTaskNotify()2.2函数xTaskNotifyFromISR()2.3函数xTaskNotifyGive()2.4函数vTaskNotifyGiveFromISR()2.5函数xTaskNotifyAndQuery()2.6函数xTaskNotifyAndQueryFromISR() 三、获取任务通知3.1函数ulTaskNotifyTake()3.2函数xTas…

[进阶]Java:打印流、Properties、common-io框架

打印流&#xff1a; 作用&#xff1a;打印流可以实现方便、高效的打印数据到文件中去。打印流一般是&#xff1a;PrintStream&#xff0c;PrintWriter两个类。可以实现打印什么数据就是什么数据&#xff0c;例如打印整数97写出去就是97&#xff0c;打印boolean的true&#xff…

chatgpt赋能python:Python截取某段文字的方法

Python截取某段文字的方法 在处理文本数据时&#xff0c;截取某段文字是常见需求。Python作为一门优秀的脚本语言&#xff0c;提供了多种方法来完成这个任务。本篇文章将介绍Python截取某段文字的几种方便易用的方法。 方法一&#xff1a;使用切片 Python中的切片操作可以方…

JavaScript的一些编程题分享

将字符串abc-def-ghi转换为驼峰格式 这里我们的思路是利用字符串方法和正则表达式 const str abc-def-ghi;const camelCaseStr str.replace(/[-_][^-_]/g, match > match.charAt(1).toUpperCase());console.log(camelCaseStr); // abcDefGhi 这里使用了 replace 方法&a…