P1102 A-B 数对
# A-B 数对
## 题目背景
出题是一件痛苦的事情!
相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!
## 题目描述
给出一串正整数数列以及一个正整数 $C$,要求计算出所有满足 $A - B = C$ 的数对的个数(不同位置的数字一样的数对算不同的数对)。
## 输入格式
输入共两行。
第一行,两个正整数 $N,C$。
第二行,$N$ 个正整数,作为要求处理的那串数。
## 输出格式
一行,表示该串正整数中包含的满足 $A - B = C$ 的数对的个数。
## 样例 #1
### 样例输入 #1
```
4 1
1 1 2 3
```
### 样例输出 #1
```
3
```
## 提示
对于 $75\%$ 的数据,$1 \leq N \leq 2000$。
对于 $100\%$ 的数据,$1 \leq N \leq 2 \times 10^5$,$0 \leq a_i <2^{30}$,$1 \leq C < 2^{30}$。
2017/4/29 新添数据两组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include <bits/stdc++.h> #define fi first #define se second using namespace std; const int N=2e5+10; const int M=2e5+10; const int mod = 1e9 + 7; const int INF = 0x3f3f3f3f; typedef long long LL; typedef pair< int , int >PII; typedef pair<LL,LL>PLL; LL gcd(LL a,LL b) { return b?gcd(b,a%b):a;} LL lcm(LL a,LL b) { return a/gcd(a,b)*b;} LL lowbit(LL a){ return a&-a;} //8个方向的和4个方向的是不同的计算方法 int n,c; LL a[N]; LL res; LL cnt( int x, int k) { int cnt1=0,cnt2=0; int l=1,r=n; //第一个大于等于x的位置下标 while (l<r) { int mid=l+r>>1; //因为没有交换,所以不用存数值 if (a[mid]>=x)r=mid; else l=mid+1; } cnt1=l; //最后 一个小于等于它的 l=1,r=n; while (l<r) { int mid=l+r+1>>1; if (a[mid]<=x)l=mid; else r=mid-1; } cnt2=r; if (cnt1>cnt2||a[cnt1]!=x) return 0; if (cnt1<=k&&k<=cnt2) return cnt2-cnt1; else return cnt2-cnt1+1; //r减去了1 所以 加一,没有减去就不用加了 } int main() { scanf ( "%d%d" ,&n,&c); for ( int i=1;i<=n;i++) scanf ( "%lld" ,&a[i]); sort(a+1,a+n+1); for ( int i=n;i>=1;i--) { if (a[i]<c) break ; res+=cnt(a[i]-c,i); } cout<<res<<endl; return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话