本文共 2075 字,大约阅读时间需要 6 分钟。
当面临区间放置和查询操作的问题时,一个高效的数据结构是必不可少的。我们可以利用差分数组和线段树的结合使用,来达到快速更新和查询的目的。
为了满足操作的高效性,我们选择以下数据结构:
具体步骤如下:
#includeusing namespace std;const int maxn = 1e5 + 7;const ll inf = 34359738370;int sum[2][maxn < 2];struct LineSegmentTree { int size; int now; LineSegmentTree(int n) : size(n) {} void update(int pos, int val) { // 单点更新操作,更新pos位置的值为val } ll query(int l, int r) { // 查询区间 [l, r] 的和 }};// 初始化线段树void init.LineSegmentTree(int n) { // 初始化一个线段树,大小为n}// 更新操作void LineSegmentTree::update(int pos, int val) { // 通过递归更新,单点修改}// 查询操作ll LineSegmentTree::query(int l, int r) { // 通过递归查询区间 [l, r] 的和}int main() { int n, m; scanf("%d %d", &n, &m); LineSegmentTree st1(n), st2(n); // 分别处理左端点和右端点 for (int i = 0; i < 2; ++i) { for (int j = 1; j <= n; ++j) { // 初始化差分数组 sum[i][j] = 0; } } while (m--) { int f, x, y; scanf("%d %d %d", &f, &x, &y); if (f == 1) { // 操作1: 放置区间[x, y] // 左端点更新 st1.update(x, 1); st1.update(y + 1, -1); st2.update(x, 1); st2.update(y + 1, -1); } else { // 操作2: 查询区间 [x, y] 内的数据 if (x > 1) { ll sum_left = st1.query(1, x - 1); ll sum_y = st1.query(1, y); cout << sum_y - sum_left << '\n'; } else { ll sum_y = st1.query(1, y); cout << sum_y << '\n'; } } }}
这种方法通过结合差分数组和线段树,实现了高效地处理区间放置和查询操作,适用于大规模数据的场景。
转载地址:http://bkjyk.baihongyu.com/