用c++写一个线段树区间覆盖
时间: 2024-02-18 07:36:53 浏览: 91
下面是一个简单的 C++ 实现线段树区间覆盖:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 100005;
struct SegmentTree {
int l, r, cov;
} tree[MAXN << 2];
void build(int rt, int l, int r) {
tree[rt].l = l;
tree[rt].r = r;
tree[rt].cov = 0;
if (l == r) return;
int mid = (l + r) >> 1;
build(rt << 1, l, mid);
build(rt << 1 | 1, mid + 1, r);
}
void pushdown(int rt) {
if (tree[rt].cov != 0) {
int cov = tree[rt].cov;
tree[rt << 1].cov = cov;
tree[rt << 1 | 1].cov = cov;
tree[rt].cov = 0;
}
}
void update(int rt, int l, int r, int val) {
if (l <= tree[rt].l && r >= tree[rt].r) {
tree[rt].cov = val;
return;
}
pushdown(rt);
int mid = (tree[rt].l + tree[rt].r) >> 1;
if (l <= mid) update(rt << 1, l, r, val);
if (r > mid) update(rt << 1 | 1, l, r, val);
}
int query(int rt, int p) {
if (tree[rt].cov != 0) return tree[rt].cov;
if (tree[rt].l == tree[rt].r) return 0;
pushdown(rt);
int mid = (tree[rt].l + tree[rt].r) >> 1;
if (p <= mid) return query(rt << 1, p);
else return query(rt << 1 | 1, p);
}
int main() {
int n, m;
cin >> n >> m;
build(1, 1, n);
for (int i = 0; i < m; i++) {
int l, r, val;
cin >> l >> r >> val;
update(1, l, r, val);
}
for (int i = 1; i <= n; i++) {
cout << query(1, i) << " ";
}
return 0;
}
```
这个实现比较简单,区间覆盖的操作就是将一个区间内的值都改为指定的值,查询时只需要查找当前位置的覆盖值即可。当然,如果你需要支持更多的操作,也可以在这个基础上进行扩展。
阅读全文