原题传送
分析
根据原题数据范围可知,暴力 O ( n 2 ) O(n^2) O(n2) 会被卡时间,所以本题作者用了 m a p map map,即 O ( n l o g n ) O(nlogn) O(nlogn) 的方法。
其实这题只需要简单地转换一下,把 A − B = C A - B = C A−B=C 转换成 A − C = B A - C = B A−C=B ,就会好做很多。
先用一个 m a p map map 把每个数字存起来,然后扫一遍 m a p map map 里的每个“数字 − c -c −c”即可~
代码
#include<bits/stdc++.h>
#define int long long//如果加了这行那下面一定要改成signed main
using namespace std;
int n,c,ans,a[200005];
map<int,int>tot;//map映射
signed main(){
cin>>n>>c;//读入
for(int i=0;i<n;i++){
cin>>a[i];//用a数组存
tot[a[i]]++;//用map的话O(logn)读入
}
for(int i=0;i<n;i++)
ans+=tot[a[i]-c];//map好处就是可以logn读取
cout<<ans;
return 0;//华丽结束~~
}
总结
总之,这题就是一个简单的 S T L − m a p STL-map STL−map 的应用~