首页 > 其他分享 >[树状数组] 学习笔记

[树状数组] 学习笔记

时间:2023-08-23 11:44:36浏览次数:47  
标签:return limits 树状 int sum 笔记 cdot 数组

原理

int lowbit(int x)
{
	return x & (-x);
}

void add(int x, int k)
{
	for (; x <= n; x += lowbit(x)) c[x] += k;
}

int query(int x)
{
	int ans = 0;
	for (; x ; x -= lowbit(x)) ans += c[x];
	return ans;
}

单点修改 + 区间查询

int lowbit(int x)
{
	return x & (-x);
}
void add(int x, int k)
{
	for (; x <= n; x += lowbit(x)) c[x] += k;
}
int query(int x)
{
	int ans = 0;
	for (; x ; x -= lowbit(x)) ans += c[x];
	return ans;
}
void init()
{
	for (int i = 1; i <= n; i ++) add(i, a[i]);
}
void get_add(int x, int k)
{
	add(x, k);
}
int get_query()
{
	return query(y) - query(x - 1);
}

单点查询 + 区间修改

设差分数组 \(b\),定义 \(b[i]=a[i]-a[i-1](a[0]=0,i\in[1,n])\),则有两个性质:

  • \(a[i]+=k\Leftrightarrow \begin{cases}b[l] +=k\\b[r+1] -=k\end{cases}~(i\in[l,r])\)

  • \(a[x] = \sum\limits_{i=1}^{x}b[i]\)

int lowbit(int x)
{
	return x & (-x);
}
void add(int x, int k)
{
	for (; x <= n; x += lowbit(x)) c[x] += k;
}
int query(int x)
{
	int ans = 0;
	for (; x ; x -= lowbit(x)) ans += c[x];
	return ans;
}
void init()
{
	for (int i = 1; i <= n; i ++)
	{
		b[i] = a[i] - a[i-1];
		add(i, b[i]);
	}
}
void get_add(int x, int y, int k)
{
	add(x, k);
	add(y + 1, -k);
}
int get_query()
{
	return query(x);
}

区间查询 + 区间修改

在差分思想的基础上,若查询原数组 \(a\) 的 \([1,p]\) 的区间和,则有:

\[\begin{aligned}\sum\limits_{i=1}^{p}a[i] &= \sum\limits_{i=1}^{p}\sum\limits_{j=1}^{i}b[j] \\ &=\sum\limits_{i=1}^{p}[~b[i]\cdot(p-i+1)~] \\ &=\sum\limits_{i=1}^{p}[~b[i]\cdot(p+1)-b[i]\cdot i~] \\ &=\sum\limits_{i=1}^{p}[~b[i]\cdot(p+1)~]-\sum\limits_{i=1}^{p}(~b[i]\cdot i~) \end{aligned}\]

到最后一个式子就把不同的变量分离了,实现更简单,\(b[i]\cdot i\) 可以再建一个树状数组代替。

注意:树状数组中的下标不是原数组的下标,在 \(p\) 这个位置上加,所以是\(\times p\) ,而不是 \(\times x\)

int lowbit(int x)
{
	return x & (-x);
}
void add(int x, int k)
{
	int p = x;
	for (; x <= n; x += lowbit(x)) 
	{
		c1[x] += k;
		c2[x] += k * p;
	}
}
int query(int x)
{
	int ans = 0, p = x;
	for (; x ; x -= lowbit(x)) 
		ans += (p + 1) * c1[x] - c2[x];
	return ans;
}
void init()
{
	for (int i = 1; i <= n; i ++)
	{
		b[i] = a[i] - a[i-1];
		add(i, b[i]);
	}
}
void get_add(int x, int y, int k)
{
	add(x, k);
	add(y + 1, -k);
}
int get_query()
{
	return query(y) - query(x - 1);
}

标签:return,limits,树状,int,sum,笔记,cdot,数组
From: https://www.cnblogs.com/hi-zwjoey/p/17650792.html

相关文章

  • Python基础入门学习笔记 066 GUI的终极选择:Tkinter3
    实例1:Checkbutton组件1fromtkinterimport*23root=Tk()4#需要一个Tkinter变量,用于表示该按钮是否被选中5v=IntVar()6c=Checkbutton(root,text="测试一下",variable=v)78c.pack()9#如果被选中,那么变量v被赋值为1,否则为010#可以用个Label......
  • Vue学习笔记:Pinia Part02 Store
    在Pinia中有option和setup两种写法OptionStore与Vue的选项式API类似,我们也可以传入一个带有 state、actions 与 getters 属性的Option对象exportconstuseCounterStore=defineStore('counter',{state:()=>({count:0}),getters:{double:(state)......
  • Python基础入门学习笔记 064 GUI的终极选择:Tkinter
    >>>importtkinter #Tkinter是python默认的GUI库,导入Tkinter模块>>> 实例1:1importtkinterastk23root=tk.Tk()#创建一个主窗口,用于容纳整个GUI程序4root.title("FishCDemo")#设置主窗口对象的标题栏56#添加一个Label组件,可以显示文本、图标或者图......
  • Python基础入门学习笔记 065 GUI的终极选择:Tkinter2
    实例1:Label组件显示文字与gif图片1#导入tkinter模块的所有内容2fromtkinterimport*34#创建主窗口5root=Tk()6#创建一个文本Label对象,文字为左对齐,离左边边框距离为107textLabel=Label(root,8text="您下载的影片含有未成年人......
  • Prometheus--学习笔记
    Prometheus  https://prometheus.fuckcloudnative.io/1.指标类型:四种核心指标类型Counter计数器Inc,Add,rate,topkGauge仪表盘daltapredict_linerHistogram直方图histogram_quantilesummary摘要,与histogram类似,不同点在于:关于分位数 原文链接:https://blog.......
  • Python基础入门学习笔记 048 魔法方法:迭代器
    迭代的意思类似于循环,每一次重复的过程被称为一次迭代的过程,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。提供迭代方法的容器称为迭代器(如序列(列表、元组、字符串)、字典等)。对一个容器对象调用iter()就得到它的迭代器,调用next()迭代器就会返回下一个值。入托迭代器没......
  • Python基础入门学习笔记 049 乱入:生成器
    所谓协同程序,就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始。生成器可以暂时挂起函数,并保留函数的局部变量等数据,然后在再次调用它的时候,从上次暂停的位置继续执行下去。一个函数中如果有yield语句,则被定义为生成器。实例1:......
  • Python基础入门学习笔记 050 模块:模块就是程序
    什么是模块•容器->数据的封装•函数->语句的封装•类->方法和属性的封装•模块->模块就是程序命名空间爱的宣言:世界上只有一个名字,使我这样牵肠挂肚,像有一根看不见的线,一头牢牢系在我心尖上,一头攥在你手中,这个名字就叫做鱼C工作室计算机一班的小花……导入模块•......
  • 斜率优化学记笔记
    [例题](https://www.luogu.com.cn/problem/P3195)考虑朴素做法:$f_i$表示把前$i$个玩具装箱所需的最小费用,$s_i$为$c_i$的前缀和,则有:$$f_i=\min\limits_{j=1}^i(f_{j-1}+(i-j+s_i-s_{j-1}-L)^2)$$令$g_i=i+s_i-L,x_i=j+s_{j-1}$,则有:$$f_i=\min\limits_{j=1}^i(f_{j-1}+(g_i-......
  • Python基础入门学习笔记 039 类和对象:拾遗
    组合(将需要的类一起进行实例化并放入新的类中)实例:1classTurtle:2def__init__(self,x):3self.num=x45classFish:6def__init__(self,x):7self.num=x89classPool:10def__init__(self,x,y):11self.tu......