【算法分析】
下面说明中的v表示STL中的vector实例。
1.lower_bound(v.begin(), v.end(), key)-v.begin()返回有序序列中大于等于key的第一个值的位置
2.upper_bound(v.begin(), v.end(), key)-v.begin()返回有序序列中大于key的第一个值的位置
3.lower_bound(v.begin(), v.end(), key, greater<int>())-v.begin()返回有序序列中小于等于key的第一个值的位置
4.upper_bound(v.begin(), v.end(), key, greater<int>())-v.begin()返回有序序列中小于key的第一个值的位置
5.上述四个函数,若无满足条件的值,则返回v.size()
【算法代码】
#include <bits/stdc++.h>
using namespace std;
int main() {
int key;
cin>>key;
vector<int> v;
int x;
while(cin>>x) {
v.push_back(x);
}
sort(v.begin(),v.end());
//lower_bound(v.begin(), v.end(), key)-v.begin()返回有序序列中大于等于key的第一个值的位置
//upper_bound(v.begin(), v.end(), key)-v.begin()返回有序序列中大于key的第一个值的位置
//lower_bound(v.begin(), v.end(), key, greater<int>())-v.begin()返回有序序列中小于等于key的第一个值的位置
//upper_bound(v.begin(), v.end(), key, greater<int>())-v.begin()返回有序序列中小于key的第一个值的位置
//上述四个函数,若无满足条件的值,则返回v.size()
int L=lower_bound(v.begin(), v.end(), key)-v.begin();
int U=upper_bound(v.begin(), v.end(), key)-v.begin();
int P=lower_bound(v.begin(), v.end(), key, greater<int>())-v.begin();
int Q=upper_bound(v.begin(), v.end(), key, greater<int>())-v.begin();
cout<<L<<" "<<U<<" "<<P<<" "<<Q<<endl;
return 0;
}
/*
in:
8
12 8 8 6 2 9 12 11 3
out:
3 5 0 9
*/
【运行截图】
【注意事项】
运行程序,输入测试样例后,回车后按Ctrl+z便可出现结果。
代码中若有多条输入语句且存在 while(cin>>x) 输入语句时,一定要确保while(cin>>x) 语句放在所有其他输入语句之后。
特别注意在使用STL中的lower_bound(v.begin(), v.end(), key)-v.begin();、upper_bound(v.begin(), v.end(), key)-v.begin();函数之前,不要忘了先利用语句 sort(v.begin(),v.end()); 进行排序。其中的v表示STL中的vector。