洛谷[P1102 A-B 数对] {二分} | {map} 奋斗的珂珂~

洛谷基础题练习3 洛谷基础入门题练习,加减算式、字母替换、数字反转、面积比较。 阅读详情

洛谷[P1102 A-B 数对] {二分} | {map}

题目描述

出题是一件痛苦的事情!

相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!

好吧,题目是这样的:给出一串数以及一个数字 CC,要求计算出所有A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。

输入格式

输入共两行。

第一行,两个整数 N,C。

第二行,N 个整数,作为要求处理的那串数。

输出格式

一行,表示该串数中包含的满足 A - B = C 的数对的个数。

输入输出样例

输入
4 1
1 1 2 3
输出
3

说明/提示

对于 75% 的数据,1≤N≤2000。

对于 100% 的数据,1≤N≤2×10510^5105 。

保证所有输入数据都在 32 位带符号整数范围内。

2017/4/29 新添数据两组

分析题意

   根据给出的样例,来分析本题是如何进行处理的。由给出的4个数值1 1 2 3 ,又因为给出的值为C=1。
从头开始,
第一个数对,1(第一个1) 2,因为2-1=1;
第二个数对,1(第二个1) 2,因为2-1=1;
第三个数对,2 3,因为3-2=1;

因此,本题可以换一种说法,给出N个数、一个整数C,求在N个数的数组a1-aN中满足am-an=C(1<=m,n<=N),存在几个这样的数对。

注意

本题会有关于是否溢出的检测测试点,因为如果N=200000、C=1,而数组前10000的值为1,后100000的数值为2,那么结果就会达到101010^{10}1010,所以使用long long 来定义输出的结果值。

解题思路

有以下两种解法:

1、使用STL中的map
看到本题首先想到可以使用映射,但是又因为考虑到数组的下标对应的值可能是负数,所以放弃使用数组来进行映射换用map。使用映射之后只需要考虑是否当前值减C/加C在map有对应的映射可以得出结果。

完整代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int a[maxn];

int main()
{
    map<int,int> b;//因为映射的下标可能是负数,所以使用map函数 
    int N,C;
    scanf("%d %d",&N,&C);
    for(int i=0;i<N;i++)
    {
    	scanf("%d",&a[i]);
    	b[a[i]]++;//将a[i]在b数组上的映射加一,表示该数出现了几次 
	}
	long long ans=0;
	for(int i=0;i<N;i++)
	{
		if(b[a[i]-C])//如果该数在输入的数组元素中 ,+c/-c均可
		 ans+=b[a[i]-C];//加上输出的个数 
	}
	printf("%lld",ans);
	return 0;
 } 

2、使用upper_bound,lower_bound(二分)
upper_bound():返回的是被查序列中第一个大于查找值得指针(ai>x);
lower_bound():返回的是被查序列中第一个大于等于查找值的指针(ai>=x);

强调:
要使用二分法的前提是序列必须有序,该题未说明输入的是否有序,故需要排序。

完整代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int a[maxn];

int main()
{
	int N,C;
	scanf("%d %d",&N,&C);
	for(int i=0;i<N;i++)
	{
		scanf("%d",&a[i]);
	}
	sort(a,a+N);//二分法首先要保证序列是有序的
	long long ans=0;//ans必须是long long类型的 
	for(int i=0;i<N;i++)
	{
		ans+=((upper_bound(a,a+N,a[i]-C)-a)-(lower_bound(a,a+N,a[i]-C)-a));
		//因为输入时下标是从0开始的,所以upper_bound,lower_bound的前两个参数a,a+N表明查找范围为a0~a(N-1)
		//也就是说前两个参数表明查找范围,第三个参数表明查找的数值,因为返回的是指针所以要-a来求得坐标 
	 } 
	 printf("%lld",ans);//注意long long的输出 
	 return 0;
 } 
洛谷题集——妖梦拼木棒(数组与map运行效率) 假如我们将map作为数组来使用,我们会发现他们的运行效率截然不同! 阅读详情

相关推荐

洛谷P1102.A-B数对【二分+其他技巧】

洛谷P1102.A-B数对【二分+其他技巧】原始思路正解一:lower_bound/upper_bound正解二:mapmap的定义和优越性正解三:双指针 原始思路 排序 二分查找(对每个num[i],去找c+num[i]) 最关键的地方:每个相同的数字可能出现多遍,如果用普通的二分查找,是不能数出找到的这个数字有多少个的;于是开了一个全局变量cnt,如果num[mid]与target正好相等,cnt++,并且递归调用二分查找函数,而不是直接改变边界。 造成超时的主要原因:重复查找以及递归开销; 尝试过的

Aurora63_的博客 787

编程题汇总_Map和Set

1.只出现一次的数字 升级版:只出现一次的数字 2.坏键盘打字 3.前K个高频单词

RuanMeng的博客 409

Python爬虫实战:手把手教你用Selenium绕过药监局网站的反爬机制(附完整代码)

本文详细介绍了如何使用Selenium绕过药监局网站的反爬机制,提供了一套完整的Python爬虫实战方案。通过浏览器指纹伪装、动态等待策略、会话维持技巧以及分布式采集设计,帮助开发者高效爬取药监局数据,解决政府类网站常见的反爬挑战。

weixin_42620255的博客 737

P1102 A-B 数对

题目描述 出题是一件痛苦的事情! 相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈! 好吧,题目是这样的:给出一串数以及一个数字 C,要求计算出所有 A - B = C 的数对的个数(不同位置的数字一样的数对算不同的数对)。 输入格式 输入共两行。 第一行,两个整数 N,C。 第二行,N 个整数,作为要求处理的那串数。 输出格式 一行,表示该串数中包含的满足 A - B = C 的数对的个数。 输入输出样例 输入 #1 4 1 1 1 2 3 输出

qq_43457125的博客 343

基于WEKWS模型的语音唤醒关键词识别

本文所使用的模型网络结构继承自论文《Compact Feedforward Sequential Memory Networks for Small-footprint Keyword Spotting》,文中研究了将低秩矩阵分解与传统FSMN相结合的紧凑型前馈顺序记忆网络(cFSMN)用于远场关键字检测任务。

YuZhou的博客 6596

从气象预报到物流规划:多尺度地理加权回归(MGWR)在ArcGIS Pro中的实战应用

本文深入探讨了多尺度地理加权回归(MGWR)在ArcGIS Pro中的实战应用。通过对比传统GWR模型,MGWR的核心优势在于能识别不同解释变量的独特空间作用尺度,有效解决空间异质性问题。文章结合气象预报误差修正与物流网点选址两个案例,详细讲解了从数据准备、参数设置、带宽优化到结果解读的全流程,为地理数据分析师处理复杂空间数据提供了强大工具。

egg99的博客 1030

洛谷 P1102 A−B数对 二分查找

【题目描述:】 给出一串数以及一个数字 C ,要求计算出所有 A−B=C 的数对的个数。(不同位置的数字一样的数对算不同的数对) 【输入格式:】 第一行包括 2 个非负整数 N 和 C ,中间...

星卯教育-信奥教练tony 999

GAN网络(论文阅读):Generative Adversarial Nets

当判别器效果比较好时,D(G(z))值为0,则log(1-D(G(z)))值为0,当判别器效果不好,会输出一个大于0 的数,则log(1-D(G(z)))值就为一个负数,在极端情况下,会得到负无穷大,此时判别失误。在价值函数的第二项中存在问题,在早期G比较弱的时,生成的数据和真实数据相差很大,D就容易训练的比较好,很容易区分,就会导致log(1-D(G(z)))变成0 ,这样很难求梯度来优化G,所以更新G时,将优化函数改为log(D(G(z)))。最终使G赢,即G生成的数据D判别不出来。

m0_54248968的博客 2293

洛谷题单--线性表

洛谷题单--线性表

ros275229的博客 422

基于MySQL的京东用户行为分析

对京东用户行为的分析,利用AARRR模型进行分析。

SelenaSelena的博客 1910

A-Level经济例题解析及练习Opportunity Cost

例题Question: Opportunity CostYou are selling your 1996 Mustang.&nbsp; You have already spent $1000 on repairs.&nbsp;At the last minute, the transmission dies.&nbsp; You can pay $600 to have it repaired, or sell the car “as is.”In each of the fol

Alevel3的博客 744

对于STL的学习(洛谷P3613二维map)

每个寄包柜格子数量不一,第 i 个寄包柜有 𝑎𝑖(1≤𝑎𝑖≤1e5)个格子,不过我们并不知道各个 ai​ 的值。对于每个寄包柜,格子编号从 1 开始,一直到 𝑎𝑖ai​。显然我们不能开数组暴力,要开一个 𝑎[1e5][1e5]的数组,肯定MLE。已知超市里共计不会超过 107个寄包格子,ai​ 是确定然而未知的,但是保证一定不小于该柜子存物品请求的格子编号的最大值。我们可以用STL里面的map,再优化一下,二维map正好可以存下每行每列map<pair<int,int>,int>;

a13997460860的博客 518

Unity中实现俄罗斯方块

二:实现思路 ——创建每一个方块可移动到的位置点,可以理解为创建一个游戏地图,从(0,0)点开始依次向x轴和y轴延伸,例如x最大为9,y最大为19,则创建了一个20行10列的地图 ——制作每一个形状的预制体,Shape是每一个整体形状,Block是每一块小方块,CenterPos代表这个形状的旋转中心 ——创建GameController脚本控制游戏逻辑,挂载到面板物体上。创建Block脚本控制每个形状的操作,挂载到每个形状上 ——在GameController脚本中编...

L的博客 8559

#4洛谷题目分享(P1161 开灯)

洛谷练题分享,有题目_有代码_有知识点_有举例,让你做一道题掌握一类题。

qq_74168740的博客 1512

国科大学习资料--VLSI测试与可测试设计--2020期末考试试题

国科大学习资料–VLSI测试与可测试设计–2020期末考试试题 国科大学习资料–VLSI测试与可测试设计–2020期末考试试题 国科大学习资料–VLSI测试与可测试设计–2020期末考试试题 一、概念题 1简述可测试性测度与两个主要的测度指标的含义; 2以March C-算法为例,说明March算法的构成,以及March C-算法的故障覆盖率; 3“效果-原因”诊断法和“原因效果诊断法”的不同; 4列举四条扫描设计时出现的问 题及解决办法; 5最少写出1149.1与1500的五点不同; = = = = =

无名何许人的博客 1150

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

差分思想!!! 洛谷 合影问题 (STL 中map和set的区别)(STL之unique()去重函数)

题目背景 编程俱乐部即将参加程序设计大赛,在参加之前,男神丁建议大家一起合一个影。 题目描述 在比赛赛后男神丁给大家提出了一个问题,现在,你只知道俱乐部中最高的人的身高是H,在位置P上,并且给出你们n对关系,(a,b)表示a、b位置上的人可以互相看见(当且仅当他们中间的人都比他们矮时才能互相看到),求照片上每个人的最大身高可能是多少。 输入输出格式 输入格式: 第一行输入整数N,P,H,M, 接下...

006 菜是原罪 的博客 600

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

洛谷P1102 A-B 数对C++题解(改进二分+map,解析详细)

本文主要提供了洛谷P1102 A-B 数对的C++题解,并作详细的代码解析

weixin_61333208的博客 533

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

P1102 A - B 数对(二分)

题目 链接 P1102 A - B 数对 题目描述 出题是一件痛苦的事情! 相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈! 好吧,题目是这样的:给出一串数以及一个数字 C,要求计算出所有 A - B = C 的数对的个数(不同位置的数字一样的数对算不同的数对)。 输入格式 输入共两行。 第一行,两个整数 N, C。 第二行,N 个整数,作为要求处理的那串数。 输出格式 一行,表示该串数中包含的满足 A - B = C 的数对的个数。 输入输出样例 输

qq_44754132的博客 586

【洛谷 P1102】A-B 数对 题解(映射)

出题是一件痛苦的事情!相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!

HEX9CF的技术博客 381

洛谷刷题BFS-《字串变换》-map容器-find、substr

容器map<string ,int> 相当于键和值。map[string]=int ===>map["lrd"]=6做标记使用 string类型 find()函数的返回值是查找到子串在母串的起始位置,如果查找不到,返回-1 t.find(x[i],p)//表示在string类型变量t中查找x[i]字符串,从p位置开始查找,并返回int型值,代表查找到的首字符在母串中的位置。 t.substr(0,p)//表示取t中0到p位置的字符。 // An highlighted block

qq_42472662的博客 276

P1102 A-B 数对 二分

分析 手写二分 题目找A-B=C的数对个数,第一眼想到的是暴力,但是数据量一看会TLE,所以可以考虑二分;关于二分的基础模板可以看:P2249 【深基13.例1】查找 二分; 需要记住二分的时候,要注意序列的顺序为递增顺序,如果题目没排序,需要自己去排序。 我们可以转化为求解A-C=B的数对个数,然后 枚举序列,每个数当做A(a[i]),然后减去C(输入得到的),然后二分查这个序列有没有B(A-C得到的数)这个数,刚开始只考虑了存不存在,二分的思想就是查找是否存在,但是这样不对,因为人家问的是几对 ,也.

与其邻渊羡渔,不如退而结网 661

大一寒假训练九(map,set,vector)【更新完成】

## 一、map的应用 ## [洛谷 P1918 保龄球](https://www.luogu.com.cn/problem/P1918) ```cpp #include <bits/stdc++.h> using namespace std; map<int,int>a;//实际上就是定义了一个int a[1e9]的数组,但是普通数组开不到1e9那么大 int main() { int n,x1,x2,k; ios::sync_with_stdio(false); cin>>n

nefu_ljw的博客 2051

洛谷 P3613 学习用map代替大大大数组的好题

map 做的是映射,只需要开一个数组对映射就可以简单地代替一个数组大空间

abeijixingdeye的博客 672

洛谷 P1102 A-B 数对(二分查找)

题目描述 出题是一件痛苦的事情! 相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈! 好吧,题目是这样的:给出一串数以及一个数字C,要求计算出所有A - B = C 的数对的个数(不同位置的数字一样的数对算不同的数对)。 输入格式 输入共两行。 第一行,两个整数 N,C 第二行,N个整数,作为要求处理的那串数。 输出格式 一行,表示该串数中包含的满足A - B = CA−B=C的数对的个数。 输入输出样例 输入 #1复制 ...

Stillboring的博客 1130

洛谷P1102 A-B 数对 [双指针] [map]

出题是一件痛苦的事情!相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!

没有标题哈哈哈 334
上一篇: 洛谷[P2249 【深基13.例1】查找] {二分} 奋斗的珂珂~
下一篇: 洛谷[P3853 [TJOI2007]路标设置] {二分} 奋斗的珂珂~
栀子花开 �
博客等级 码龄7年 24粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值