如何找到要查询和更新查询的前两个最小要素。
我认为我必须使用细分(segment-tree)
答案 0 :(得分:0)
在<algorithm>
中,您似乎正在寻找std::nth_element
。这将确保正确放置在所需位置的元素(第二个元素),但还应确保元素少于该元素(在本例中为第一个元素)位于其左侧。所有其他元素在您想要的位置的右侧保持不确定的顺序。下面的程序:
#include <algorithm>
#include <iostream>
#include <iterator>
int main() {
using std::begin;
using std::end;
using std::next;
int array[] = {5, 2, 1, 4, 3};
std::copy(begin(array), end(array), std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
std::nth_element(begin(array), next(begin(array)), end(array));
std::copy(begin(array), end(array), std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
}
将输出(在我的机器上):
5 2 1 4 3
1 2 5 4 3
答案 1 :(得分:0)
这可以通过对RMQ段树进行简单修改来解决
这里的O(N log N)方法: