2 条题解
-
2
我回来了
先说一下,这一题应该开
long long
,因为如果数据个数为极限而且都相同那么就有 个解,上限为 ,所以应该开long long
,可是出题人没有这样的数据。这一道题我的思路是将 转换为 ,排序后枚举 在查找有没有 即可。上界、下界查找 的 有,梳理一下:
$$\begin{cases} \operatorname{upper\_bound(begin,end,value)}\to 上界查找,返回第一个大于该元素的迭代器(地址,或者说是指针)\\ \operatorname{lower\_bound(begin,end,value)}\to 下界查找,返回第一个小于等于该元素的迭代器(地址,或者说指针) \end{cases} $$注:begin和end要地址,比如说指针或者迭代器,value就是要查找的值。不懂的可以浏览或者自行百度
那么我们用这两个函数返回值的差就可以知道符合条件的 ,也就是 的个数,统计即可。
时间复杂度:
两个函数的时间复杂度都是 ,总共 次循环,每一次循环有两次函数调用,所以算法复杂度为 ,略微偏高但是容易理解(注:没有考虑 的排序
消耗:
也有哈希做法,普及一下,
不贴代码了,大概就是用哈希 的复杂度代替二分查找 ,但是需要用 进行哈希处理,不过可以在读入的时候就解决。这样的时间复杂度为 。请读者自行下来写代码,此处不再赘述。注:哈希理论上的复杂度是O(1),但是解决哈希冲突会影响复杂度,故实际操作的复杂度会比O(1)略高
代码( 请勿抄袭 )
#include<iostream> #include<algorithm> #include<vector> using namespace std; vector<int>v; int main(){ int n,c; long long ans=0; ios::sync_with_stdio(false); cin>>n>>c; v.resize(n); for(int i=0;i<n;++i){ cin>>v[i]; } sort(v.begin(),v.end()); for(int i=0;i<n;++i){ ans+=upper_bound(v.begin(),v.end(),v[i]+c)-lower_bound(v.begin(),v.end(),v[i]+c); } cout<<ans<<endl; return 0; }
- 1
信息
- ID
- 103
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 2
- 标签
- 递交数
- 68
- 已通过
- 20
- 上传者