P1102 A-B 数对
1.uva253骰子涂色2.洛谷uva2203.uva12096集合栈计算机 The SetStack Computer4.uva101The Blocks Problem5.uva400 Unix Is命令 Unix ls6.uva10391 复合词 Compound Words7.小球下落 Dropping Balls (uva679)8.树的层次遍历 Trees on the level uva1229.树 Tree uva54810.天平 Not so Mobile uva839
11.P1102 A-B 数对
12.成最多水的容器13.P3367 【模板】并查集14.947. 移除最多的同行或同列石头15.P1082 [NOIP2012 提高组] 同余方程16.803 打砖块17.B3644 【模板】拓扑排序 / 家谱树18.U107394 拓扑排序模板19.P1137 旅行计划20.936 戳印序列21.P4017 最大食物链计数22.2050 并行课程 III23.P3366 【模板】最小生成树24.P2330 [SCOI2005] 繁忙的都市25.Abbott的复仇 Abbott's Revenge26.P1960 郁闷的记者27.P4391 [BOI2009] Radio Transmission 无线传输解法一:二分搜素
首先我们知晓A-B=C,那么A=B+C,我们只需要遍历数组中的每一个元素然后在数组中搜素a[i]+c的值是否存在即可。
Code
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+5; ll a[N]; int main(){ int n,c; ll sum=0; cin>>n>>c; map<ll,int> map1; for (int i=1;i<=n;i++){ cin>>a[i]; map1[a[i]]++; } for (int i=1;i<=n;i++) if (map1.count(c+a[i])) sum+=map1[c+a[i]]; cout<<sum<<endl; }
解法二:双指针
我们先将数组按照非降序排列,我们用r1表示a[r1]-a[i]<c;r2表示a[r2]-a[i]<=c;那么对于每个a[i]我们只在需要sum+=r2-r1即可
Code
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+5; int a[N]; int main(){ int n,c; ll sum=0; cin>>n>>c; for (int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1); int r1=1,r2=1; for (int i=1;i<=n;i++){ while (r1<=n && a[r1]-a[i]<c) r1++; while (r2<=n && a[r2]-a[i]<=c) r2++; sum+=r2-r1; } cout<<sum<<endl; }
Ps:如果a数组本身就是非降序的话,法二时间复杂度只有O(n)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现