【发布时间】:2021-06-24 23:14:54
【问题描述】:
我在一些竞争性的编码网站上做了一些问题,它基本上要求你计算有多少元素大于最小值并且小于或等于最大值
例如,我有一个数组 {3,6,8,10,20},最小值为 2,最大值为 15,如果我将最小值更改为 10,则元素数为 4(从 3 到 10)并且最大到 20 元素的数量是 1 (20) 因为 20 等于最大值
这是我的代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
vector<int> bebek;
std::vector<int>::iterator low1, up1;
int N,Q, input, input2, ct;
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> input;
bebek.push_back(input);
}
cin >> Q;
for (int i = 0; i < Q; i++)
{
cin >> input >> input2;
low1 = lower_bound(bebek.begin(), bebek.end(), input+1);
up1 = upper_bound(bebek.begin(), bebek.end(), input2-1);
cout << distance(low1, up1) << endl;
}
return 0;
}
输入:
5(数组中元素的数量)
3 6 8 10 20(元素)
2(最小值和最大值)
2 15(最小和最大)
10 20(最小最大 2nd)
预期输出:
4
1
当前输出:
4
0
我可以做些什么来改进我的算法
【问题讨论】:
-
输入是否保证排序?
-
我认为这可以用二叉索引树(Fenwick 树)来解决。
-
@Meowmere 是的,网站是这么说的
-
@AndyG 你能在回答部分详细说明吗
-
BIT 允许对频率计数进行有效插入、更新和查询(均以对数时间计算)。如果您的查询与插入/更新交错,那么它是最优化的数据结构。否则,如果您已经提前拥有了所有元素,那么最简单的方法是对集合进行排序,然后使用二分搜索查找最小值和最大值的偏移量,以便执行频率计数。
标签: c++ lower-bound upperbound