#暴力76分求优化awa

P1102 A-B 数对

@[bjqxszx_wangyiheng](/user/1036940) 用桶记录就行了,只不过这一题是map ```cpp #include<bits/stdc++.h> using namespace std; map<int,long long>mp; int a[200005]; int main(){ int n,c; scanf("%d%d",&n,&c); for(int i=0;i<n;i++){ scanf("%d",&a[i]); mp[a[i]]++; } long long ans=0; for(int i=0;i<n;i++)ans+=mp[a[i]-c]; printf("%lld\n",ans); return 0; } ```
by kevinZ99 @ 2023-11-15 21:36:00


@[kevinZ0221](/user/1117080) dalao 我~~看~~~~不 懂 了~~
by bjqxszx_wangyiheng @ 2023-11-16 16:26:37


@[bjqxszx_wangyiheng](/user/1036940) 这道题可以用二分查找解决 可以先对数组进行排序。 枚举A,问题就是统计B+C出现次数。那么B+c会对应数组连续的一段。 通过二分查找可以找到连续段的左右端点,就可以解决 此问题 代码中用了STL中的lower_bound()和upper_bound() 非常实用,值得学习 代码AC 放心食用 ```cpp #include<bits/stdc++.h> using namespace std; const int mx=2e5+10; int n,c,a[mx]; int main(){ cin>>n>>c; for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n); long long ans=0; for(int i=0;i<n;i++){ ans+=upper_bound(a,a+n,a[i]+c)-lower_bound(a,a+n,a[i]+c); } printf("%lld",ans); return 0; } ```
by taoyize @ 2023-12-12 20:07:42


@[taoyize](/user/1097100) 谢谢dalao
by bjqxszx_wangyiheng @ 2023-12-13 07:25:04


|