线段树套线段树

二维线段树可以维护二维表的信息,(区域和、区域最值等)
内层树和普通线段树一样

#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;
}
posted @ 2025-02-27 15:52  流氓兔LMT  阅读(25)  评论(0)    收藏  举报