当前位置: 首页 > news >正文

二维树状数组

二维树状数组

封装一:该版本不能同时进行区间修改+区间查询。无离散化版本的空间占用为 \(\mathcal O(NM)\) 、建树复杂度为 \(\mathcal O(NM)\) 、单次查询复杂度为 \(\mathcal O(\log N\cdot \log M)\)

struct BIT_2D {int n, m;vector<vector<int>> w;BIT_2D(int n, int m) : n(n), m(m) {w.resize(n + 1, vector<int>(m + 1));}void add(int x, int y, int k) {for (int i = x; i <= n; i += i & -i) {for (int j = y; j <= m; j += j & -j) {w[i][j] += k;}}}void add(int x, int y, int X, int Y, int k) { // 区块修改:二维差分X++, Y++;add(x, y, k), add(X, y, -k);add(X, Y, k), add(x, Y, -k);}int ask(int x, int y) { // 单点查询int ans = 0;for (int i = x; i; i -= i & -i) {for (int j = y; j; j -= j & -j) {ans += w[i][j];}}return ans;}int ask(int x, int y, int X, int Y) { // 区块查询:二维前缀和x--, y--;return ask(X, Y) - ask(x, Y) - ask(X, y) + ask(x, y);}
};

封装二:该版本支持全部操作。但是时空复杂度均比上一个版本多 \(4\) 倍。

struct BIT_2D {int n, m;vector<vector<int>> b1, b2, b3, b4;BIT_2D(int n, int m) : n(n), m(m) {b1.resize(n + 1, vector<int>(m + 1));b2.resize(n + 1, vector<int>(m + 1));b3.resize(n + 1, vector<int>(m + 1));b4.resize(n + 1, vector<int>(m + 1));}void add(auto &w, int x, int y, int k) { // 单点修改for (int i = x; i <= n; i += i & -i) {for (int j = y; j <= m; j += j & -j) {w[i][j] += k;}}}void add(int x, int y, int k) { // 多了一步计算add(b1, x, y, k);add(b2, x, y, k * (x - 1));add(b3, x, y, k * (y - 1));add(b4, x, y, k * (x - 1) * (y - 1));}void add(int x, int y, int X, int Y, int k) { // 区块修改:二维差分X++, Y++;add(x, y, k), add(X, y, -k);add(X, Y, k), add(x, Y, -k);}int ask(auto &w, int x, int y) { // 单点查询int ans = 0;for (int i = x; i; i -= i & -i) {for (int j = y; j; j -= j & -j) {ans += w[i][j];}}return ans;}int ask(int x, int y) { // 多了一步计算int ans = 0;ans += x * y * ask(b1, x, y);ans -= y * ask(b2, x, y);ans -= x * ask(b3, x, y);ans += ask(b4, x, y);return ans;}int ask(int x, int y, int X, int Y) { // 区块查询:二维前缀和x--, y--;return ask(X, Y) - ask(x, Y) - ask(X, y) + ask(x, y);}
};
http://www.hskmm.com/?act=detail&tid=37743

相关文章:

  • 2025 CSP 赛前复习笔记
  • Borland Turbo products
  • 港科语义地图-低带宽场景下的多机器人地图对齐与共享定位提供了通用基石 - MKT
  • Spring Boot 整合 MiniMax 与 CosyVoice 语音合成服务实践指南
  • 港科轻量化地图 - MKT
  • PandaCoder:致敬MyBatis Log Plugin,但我们做得更极致!
  • CF1401B Ternary Sequence
  • [DOS] Borland Turbo Assembler learning 8086/real-mode assembly
  • 搭建x86汇编语言学习环境
  • 闭包
  • Python---学习
  • 离在线SDK配置
  • 傅立叶,程心和路明泽
  • SpringBoot自动配置
  • AI元人文构想与余溪诗学空间:一场从诗意本源向智能未来的远征
  • 状压DP
  • 搞定三大PLC通讯:倍福与西门子、欧姆龙与西门子数据互通实战
  • 实验p66
  • 牛客2025秋季算法编程训练联赛2-(基础组提升组)
  • 局域网共享一键通_v2.0.9.9
  • newDay15
  • 每日反思(2025_10_23)
  • 树链剖分/轻重链剖分
  • 如何降低信息化系统的构建成本? ——信息化系统省钱全攻略:从规划到运维的实用技巧
  • C#编程时winform程序登陆记住密码和自动登录功能,关于App.config的问题及解决方案
  • 2025.10.23总结
  • Day2超链接标签
  • Ai元人文构想:你喜欢黑箱与偏见
  • 企业微信 使用api批量处理群消息
  • first game (1)