1:lower_bound()和upper_bound()都是利用二分查找的方法实现的.
1:lower_bound(begin,end,val);该函数可以在一个已经排序好的序列中,从begin位置一直到end位置前一个来查找第一个大于等于val值的位置,返回这个位置的指针,同时,这个指针减去begin,即可得到偏移值offset,也就是数组的下标。
upper_bound(begin,end,val);该函数和上面一个函数类似,只不过查找的是第一个大于val的位置,注意:上述连个函数,如果在没有找到符合条件的位置的话,就返回end,也就是超出范围的一个指针,如果是数组的话,也就是越界的指针。
3:举个栗子
//@author:hairu,wu
//@from:ahut
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int max_n=100100;
int school[max_n];
int m,n;
ll ans=0;
int main(){
cin >> m>>n;
for(int i=0;i<m;i++){
cin >> school[i];
}
sort(school,school+m);
for(int i=0;i<n;i++){
int x;
cin >> x;
int pos1=lower_bound(school,school+m,x)-school;
if(pos1==0){
ans+=abs(school[0]-x);
}else if(pos1==m){
ans+=abs(school[m-1]-x);
}else{
int pos2=pos1-1;
ans+=min(abs(school[pos1]-x),abs(school[pos2]-x));
}
}
cout<<ans<<endl;
return 0;
}