600B |代码部队 |查询小于或等于元素
600B | Codeforces | Queries about less or equal elements
问题如下:Link
我的代码如下:
#include <bits/stdc++.h>
using namespace std;
#define output(x) cout << x << endl
#define ll long long
ll binarySearch(vector<ll> vec, ll num, ll n) {
ll left = 0;
ll right = n-1;
ll mid = 0;
while (left <= right) {
mid = (left+right)/2;
if (left == right) {
break;
}
if (vec[mid] <= num) {
left = mid+1;
}
else {
right = mid;
}
}
if (vec[mid] <= num) {
return mid+1;
}
return mid;
}
int main(int argc, char const *argv[])
{
ios_base::sync_with_stdio(false);
ll a, b;
cin >> a >> b;
vector<ll> avec(a);
for (auto &it: avec) {
cin >> it;
}
sort(avec.begin(), avec.end());
ll curr;
map<ll, ll> answers;
while (b--) {
cin >> curr;
if (answers[curr] != 0) {
cout << answers[curr] << " ";
}
else {
ll ans = binarySearch(avec, curr, a);
answers[curr] = ans;
cout << ans << " ";
}
}
cout << "\n";
return 0;
}
这没有超过时间限制。但是,当我使用内部函数 upper_bound
而不是调用我的 binarySearch
时,它通过了
upper_bound
调用如下
cout << (upper_bound(avec.begin(), avec.end(), curr) - avec.begin()) << " ";
有没有不用内部函数就可以成功提交这个问题的方法?二分查找可以更优化吗?
这里,ll binarySearch(vector<ll> vec, ll num, ll n) {
,你通过复制传递向量vec
。
复制的复杂度为O(n)。所以,即使算法是O(logn),函数的全局复杂度仍然是O(n)。
通过引用调用:
ll binarySearch(vector<ll> &vec, ll num, ll n) {
调用本身的成本为 O(1),函数的全局复杂度保持为 O(logn)。
问题如下:Link
我的代码如下:
#include <bits/stdc++.h>
using namespace std;
#define output(x) cout << x << endl
#define ll long long
ll binarySearch(vector<ll> vec, ll num, ll n) {
ll left = 0;
ll right = n-1;
ll mid = 0;
while (left <= right) {
mid = (left+right)/2;
if (left == right) {
break;
}
if (vec[mid] <= num) {
left = mid+1;
}
else {
right = mid;
}
}
if (vec[mid] <= num) {
return mid+1;
}
return mid;
}
int main(int argc, char const *argv[])
{
ios_base::sync_with_stdio(false);
ll a, b;
cin >> a >> b;
vector<ll> avec(a);
for (auto &it: avec) {
cin >> it;
}
sort(avec.begin(), avec.end());
ll curr;
map<ll, ll> answers;
while (b--) {
cin >> curr;
if (answers[curr] != 0) {
cout << answers[curr] << " ";
}
else {
ll ans = binarySearch(avec, curr, a);
answers[curr] = ans;
cout << ans << " ";
}
}
cout << "\n";
return 0;
}
这没有超过时间限制。但是,当我使用内部函数 upper_bound
而不是调用我的 binarySearch
时,它通过了
upper_bound
调用如下
cout << (upper_bound(avec.begin(), avec.end(), curr) - avec.begin()) << " ";
有没有不用内部函数就可以成功提交这个问题的方法?二分查找可以更优化吗?
这里,ll binarySearch(vector<ll> vec, ll num, ll n) {
,你通过复制传递向量vec
。
复制的复杂度为O(n)。所以,即使算法是O(logn),函数的全局复杂度仍然是O(n)。
通过引用调用:
ll binarySearch(vector<ll> &vec, ll num, ll n) {
调用本身的成本为 O(1),函数的全局复杂度保持为 O(logn)。