STL包含四种不同的二分查找算法,binary_search lower_bound upper_bound equal_range.他们的作用域是已经排序好的的数组。
2 5 5 -100 0 100 101 102 5 300 -100 0 100 101 102
3 10
参考代码一(使用二分查找函数upper_bound)
#include <iostream> #include <cstdio> #include <algorithm> #include <map> #include <vector> #include <queue> #include <cstring> #include <cmath> #include <climits> #define eps 1e-10 using namespace std; typedef long long ll; const int INF=INT_MAX; const int maxn = 1e5+10; int n,k,a[maxn]; int main() { // freopen("input.txt","r",stdin); int T;cin>>T; while(T--){ cin>>n>>k; for(int i=0;i<n;i++) scanf("%d",a+i); sort(a,a+n); ll ans=0; for(int i=0;i<n;i++){ ans+=upper_bound(a,a+n,a[i]+k)-a-1-i;//upper_bound返回值-a得到<=a[i]+k的元素个数,再-1是为了矫正初始位置从0开始,最后减去i得到的是与i的pair个数 } printf("%lld\n",ans); } return 0; }
参考代码二(手写二分查找函数)
#include <iostream> #include <cstdio> #include <algorithm> #include <map> #include <vector> #include <queue> #include <cstring> #include <cmath> #include <climits> #define eps 1e-10 using namespace std; typedef long long ll; const int INF=INT_MAX; const int maxn = 1e5+10; int n,k,a[maxn]; ll ans; int binary_search(int num,int pos){ int low=pos+1,high=n-1,mid,res=0; while(low<=high){ mid=(low+high)>>1; if(a[mid]-num>k) high=mid-1; else{ res=mid-pos;//直接得到pair个数,否则还要判断有没有结果再处理 low=mid+1; } } return res;//没有则返回初始值0 } int main() { // freopen("input.txt","r",stdin); int T;cin>>T; while(T--){ scanf("%d%d",&n,&k); for(int i=0;i<n;i++) scanf("%d",a+i); sort(a,a+n); ans=0; for(int i=0;i<n;i++){ ans+=binary_search(a[i],i);//累加过程 } printf("%lld\n",ans); } return 0; }
STL之二分查找:hdu 5178 ( BestCoder Round #31 1001 )
原文地址:http://blog.csdn.net/u012717411/article/details/44000959