ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【模板】树状数组

2022-08-22 16:32:08  阅读:139  来源: 互联网

标签:B2 树状 int ll add 数组 inline query 模板


【模板】树状数组

一维树状数组

#define lowbit(x) ((x) & (-x))

const int maxN = 1e6 + 10;

typedef long long ll;

struct BIT {
    ll data[maxN << 2];

    inline void add(int k, int x) {
        while (k <= N) {
            data[k] += x;
            k += lowbit(k);
        }
    }

    inline ll query(int k) {
        ll ans = 0;
        while (k >= 1) {
            ans += data[k];
            k -= lowbit(k);
        }
        return ans;
    }
};

单点修改区间查询

BIT B;

inline void add(int k, int x) {
	B.add(k, x);
}
inline ll query(int l, int r) {
	return B.query(r) - B.query(l - 1);
}

区间修改区间查询

BIT B1, B2;

inline void add(int l, int r, int x) {
	B1.add(l, x);
	B1.add(r + 1, -x);
	B2.add(l, x * (l - 1));
	B2.add(r + 1, -x * r);
}

inline ll query(int l, int r) {
	ll s1 = (l - 1) * B1.query(l - 1) - B2.query(l - 1);
	ll s2 = r * B1.query(r) - B2.query(r);
	    return s2 - s1;
}

二维树状数组

#define lowbit(x) ((x)&(-x))

const int maxN = 5e3;

typedef long long ll;

struct BIT2 {
	ll data[maxN][maxN];

	inline void add(int x, int y, int val) {
		for (int i = x; i <= N; i += lowbit(i)) {
			for (int j = y; j <= M; j += lowbit(j)) {
				data[i][j] += val;
			}
		}
	}

	inline ll query(int x, int y) {
		ll ans = 0;
		for (int i = x; i; i -= lowbit(i)) {
			for (int j = y; j; j -= lowbit(j)) {
				ans += data[i][j];
			}
		}
		return ans;
	}
};

单点修改矩阵查询

BIT2 B;

inline void add(int x, int y, int val) {
	B.add(x, y, val);
}

inline ll query(int x1, int y1, int x2, int y2) {
	return B.query(x2, y2) - B.query(x1 - 1, y2) - B.query(x2, y1 - 1) + B.query(x1 - 1, y1 - 1)
}

矩阵修改矩阵查询

BIT2 B1, B2, B3, B4;

inline void upd(int x, int y, ll k) {
	B1.add(x, y, k);
	B2.add(x, y, x * k);
	B3.add(x, y, y * k);
	B4.add(x, y, x * y * k);
}

inline ll que(int x, int y) {
	return 	B1.query(x, y) * (x + 1) * (y + 1) -
	        B2.query(x, y) * (y + 1) -
	        B3.query(x, y) * (x + 1) +
	        B4.query(x, y);
}

inline void add(int a, int b, int c, int d, ll x) {
	upd(a, b, x);
	upd(c + 1, d + 1, x);
	upd(c + 1, b, -x);
	upd(a, d + 1, -x);
}

inline ll query(int a, int b, int c, int d) {
	return que(c, d) - que(a - 1, d) - que(c, b - 1) + que(a - 1, b - 1);
}

标签:B2,树状,int,ll,add,数组,inline,query,模板
来源: https://www.cnblogs.com/burnling/p/16613248.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有