#include \n#include \n#include \n\nusing namespace std;\n\n// 结点结构体\nstruct Node {\n int value; // 结点的值\n int left; // 结点表示的区间左端点\n int right; // 结点表示的区间右端点\n};\n\n// 权值线段树类\nclass SegTree {\nprivate:\n vector tree; // 线段树数组\n vector arr; // 原始数组\n\n // 建立线段树\n void build(int node, int left, int right) {\n if (left == right) {\n tree[node].value = arr[left];\n tree[node].left = left;\n tree[node].right = right;\n return;\n }\n\n int mid = (left + right) / 2;\n build(node * 2, left, mid);\n build(node * 2 + 1, mid + 1, right);\n tree[node].value = min(tree[node * 2].value, tree[node * 2 + 1].value);\n tree[node].left = left;\n tree[node].right = right;\n }\n\n // 查询区间最左侧的值\n int query(int node, int left, int right) {\n if (tree[node].left == left && tree[node].right == right) {\n return tree[node].value;\n }\n\n int mid = (tree[node].left + tree[node].right) / 2;\n if (right <= mid) {\n return query(node * 2, left, right);\n }\n else if (left > mid) {\n return query(node * 2 + 1, left, right);\n }\n else {\n return min(query(node * 2, left, mid), query(node * 2 + 1, mid + 1, right));\n }\n }\n\npublic:\n // 构造函数\n SegTree(const vector& input) {\n arr = input;\n int n = input.size();\n tree.resize(4 * n); // 根据输入数组大小初始化线段树数组\n build(1, 0, n - 1); // 建立线段树\n }\n\n // 查询区间最左侧的值\n int queryLeft(int left, int right) {\n return query(1, left, right);\n }\n};\n\nint main() {\n vector input = {4, 1, 5, 3, 2, 6};\n\n SegTree segTree(input);\n\n int left = 2;\n int right = 4;\n int minValue = segTree.queryLeft(left, right);\n\n cout << "最左侧的值为:" << minValue << endl;\n\n return 0;\n}

C++ 权值线段树:查询区间最左侧值

原文地址: https://www.cveoy.top/t/topic/qhui 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录