首页 > 其他分享 >【模板】树状数组

【模板】树状数组

时间:2022-08-22 16:35:14浏览次数:70  
标签: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,模板
From: https://www.cnblogs.com/burnling/p/16613248.html

相关文章

  • 【Java基础】什么是数组
    1.什么是数组Array:多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,通过编号的方式对这些数据进行统一管理。(1)说明①数组本身是引用数据类型,数组中的元素可......
  • 展开运算符在数组和对象中的使用
    1.数组中使用1.1合并2个数组constarr1=[1,2,3]constarr2=[4,5,6]console.log([...arr1,...arr2])1.2求最值constarr1=[1,2,3]......
  • js实现 chunk 函数分组数组
    //自己实现functionchunk(list,size){letlen=list.length;if(size<1||!len){return[];}if(size>len){return[......
  • useEffect监听订阅的数组并叠加更新
    遇到的问题,解决了小计一下:我通过useNavigate和useLocation传递了一个数组,在组件中通过useEffect监听location.state,将它携带的数组B累加到原来的数组Aconstlocation......
  • 数组找符合要求的n元对
    abc265Dhttps://atcoder.jp/contests/abc265/tasks/abc265_d找到符合条件的xyzw使得前缀和ssy-1-sx-1=psz-1-sy-1=qsr-1-sz-1=r#include<bits/stdc++.h>using......
  • JAVA基础--数组--2022年8月21日
    第一节数组静态定义方式1、数组的静态初始化的写法和特点是什么样的?  2、数组属于什么类型,数组变量中存储的是什么?引用数据类型,存储的是......
  • 为什么渲染的时候,明明ajax请求没问题,模板引擎也没问题,却没有呢(layui加template)
    这是因为layui的渲染机制造成的,你在加载的时候是空的,然后你模板获取到之后,已经渲染结束了,所以啥也没有,这个时候我们需要重新渲染一下//初始化文章分类functioninit......
  • pr2022如何导入.mogrt文件?pr模板的安装方法
    Mogrt格式的模板文件是一种新型的模板格式,因此对Premiere软件版本的要求较高,导致了许多人在使用模板是会出现不知如何导入的问题。现在小编为大家带来具体导入方法。首先,......
  • Resolve模板如何导入,达芬奇模板导入方法
    作为视频后期调色软件,达芬奇Resolve是影视制作的首选工具,随着功能的不断进步,人们越来越喜欢直接套用达芬奇模板,今天为您分享的是达芬奇模板导入方法。到菜单栏,选择项目管......
  • 离线树状数组例题
    https://codeforces.ml/contest/1712/problem/E2题解:https://www.bilibili.com/video/BV1uB4y167ig?spm_id_from=333.1007.top_right_bar_window_view_later.content.cli......