线段树套线段树
二维线段树可以维护二维表的信息,(区域和、区域最值等)
内层树和普通线段树一样
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 5;
int n, m;
int s;
int sum[N][N];
// 外区间查询
void find1(int x_k, int x_l, int x_r, int y_l, int y_r, int nl, int nr)
{
if (nl >= x_l && nr <= x_r)
{
find2(x_k, 1, y_l, y_r, 1, m); // 外层覆盖即入内
return;
}
int mid = (nl + nr) >> 1;
if (mid >= x_l)
find1(x_k * 2, x_l, x_r, y_l, y_r, nl, mid);
if (mid < x_r)
find1(x_k * 2 + 1, x_l, x_r, y_l, y_r, mid + 1, nl);
}
// 内区间查询
void find2(int x_k, int y_k, int y_l, int y_r, int nl, int nr)
{
if (nl >= y_l && nr <= y_r)
{
s += sum[x_k][y_k];
return;
}
int mid = (nl + nr) >> 1;
if (mid >= y_l)
find2(x_k, y_k * 2, y_l, y_r, nl, mid);
if (mid < y_r)
find2(x_k, y_k * 2 + 1, y_l, y_r, mid + 1, nr);
}
// 内修
void change2(int x_k, int y_k, int nl, int nr, int y, int a)
{
sum[x_k][y_k] += a;
if (nl == nr)
return;
int mid = (nl + nr) >> 1;
if (y <= mid)
change2(x_k, y_k * 2, nl, mid, y, a);
else
change2(x_k, y_k * 2 + 1, mid + 1, nr, y, a);
}
// 外修
void change1(int x_k, int nl, int nr, int x, int y, int a)
{
change2(x_k, 1, 1, n, y, a);
if (nl == nr)
return;
int mid = (nl + nr) >> 1;
if (x <= mid)
change1(x_k*2, nl, mid, x, y, a);
else
change1(x_k*2+1, mid + 1, nr, x, y, a);
}
int main()
{
return 0;
}
本文来自博客园,作者:流氓兔LMT,转载请注明原文链接:https://www.cnblogs.com/-include-lmt/p/18741119

浙公网安备 33010602011771号