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

树状数组模板

时间:2024-03-01 19:56:02浏览次数:31  
标签:输出 le 树状 样例 add num 数组 模板 define

单修区查

【模板】树状数组 1

题目描述

如题,已知一个数列,你需要进行下面两种操作:

  • 将某一个数加上 $x$

  • 求出某区间每一个数的和

输入格式

第一行包含两个正整数 $n,m$,分别表示该数列数字的个数和操作的总个数。

第二行包含 $n$ 个用空格分隔的整数,其中第 $i$ 个数字表示数列第 $i$ 项的初始值。

接下来 $m$ 行每行包含 $3$ 个整数,表示一个操作,具体如下:

  • 1 x k 含义:将第 $x$ 个数加上 $k$

  • 2 x y 含义:输出区间 $[x,y]$ 内每个数的和

输出格式

输出包含若干行整数,即为所有操作 $2$ 的结果。

样例 #1

样例输入 #1

5 5
1 5 4 2 3
1 1 3
2 2 5
1 3 -1
1 4 2
2 1 4

样例输出 #1

14
16

提示

【数据范围】

对于 $30%$ 的数据,$1 \le n \le 8$,$1\le m \le 10$;
对于 $70%$ 的数据,$1\le n,m \le 10^4$;
对于 $100%$ 的数据,$1\le n,m \le 5\times 10^5$。

数据保证对于任意时刻,$a$ 的任意子区间(包括长度为 $1$ 和 $n$ 的子区间)和均在 $[-2^{31}, 2^{31})$ 范围内。

样例说明:

故输出结果14、16

#include<bits/stdc++.h>
#define put(n) scanf("%lld",&n) 
#define out(n) printf("%lld\n",n)
#define ll long long
#define fd(a,b,c) for(ll a=b;a<=c;++a)
using namespace std;
int c[500100],n,m,num[500100],l,r;
char a;
int ask(int x)
{
	int ans=0;
	for(;x;x-=(x&-x)) ans+=c[x];
	return ans; 
}
void add(int x,int y)
{
	for(;x<=n;x+=(x&-x)) c[x]+=y;
}
int main()
{
//	freopen("sum.in","r",stdin);
//	freopen("sum.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>num[i];
		add(i,num[i]);
	}
	for(int i=1;i<=m;i++)
	{
		cin>>a>>l>>r;
		if(a=='1')
		{
			add(l,r);
			num[l]+=r;
		}
		else
		{
			cout<<(ask(r)-ask(l-1))<<endl; 
		}	
	}
	return 0;
}

区修单查

【模板】树状数组 2

题目描述

如题,已知一个数列,你需要进行下面两种操作:

  1. 将某区间每一个数加上 $x$;

  2. 求出某一个数的值。

输入格式

第一行包含两个整数 $N$、$M$,分别表示该数列数字的个数和操作的总个数。

第二行包含 $N$ 个用空格分隔的整数,其中第 $i$ 个数字表示数列第 $i $ 项的初始值。

接下来 $M$ 行每行包含 $2$ 或 $4$个整数,表示一个操作,具体如下:

操作 $1$: 格式:1 x y k 含义:将区间 $[x,y]$ 内每个数加上 $k$;

操作 $2$: 格式:2 x 含义:输出第 $x$ 个数的值。

输出格式

输出包含若干行整数,即为所有操作 $2$ 的结果。

样例 #1

样例输入 #1

5 5
1 5 4 2 3
1 2 4 2
2 3
1 1 5 -1
1 3 5 7
2 4

样例输出 #1

6
10

提示

样例 1 解释:

故输出结果为 6、10。


数据规模与约定

对于 $30%$ 的数据:$N\le8$,$M\le10$;

对于 $70%$ 的数据:$N\le 10000$,$M\le10000$;

对于 $100%$ 的数据:$1 \leq N, M\le 500000$,$1 \leq x, y \leq n$,保证任意时刻序列中任意元素的绝对值都不大于 $2^{30}$。

#include<bits/stdc++.h>
#define put(n) scanf("%lld",&n) 
#define out(n) printf("%lld\n",n)
#define ll long long
#define fd(a,b,c) for(ll a=b;a<=c;++a)
using namespace std;
int c[500100],n,m,num[500100],l,r,k;
char a;
int ask(int x)
{
	int ans=0;
	for(;x;x-=(x&-x)) ans+=c[x];
	return ans; 
}
void add(int x,int y)
{
	for(;x<=n;x+=(x&-x)) c[x]+=y;
}
int main()
{
//	freopen("sum.in","r",stdin);
//	freopen("sum.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>num[i];
//		add(i,num[i]);
	}
	for(int i=1;i<=m;i++)
	{
		cin>>a;
		if(a=='1')
		{
			cin>>l>>r>>k;
			add(l,k);
			add(r+1,-k);
		}
		else
		{
			cin>>k;
			cout<<(ask(k)+num[k])<<endl; 
		}	
	}
	return 0;
}

标签:输出,le,树状,样例,add,num,数组,模板,define
From: https://www.cnblogs.com/whrwlx/p/18047822

相关文章

  • Eclipse如何让项目中package呈树状显示
    1.问题项目中package呈flat平铺排序,不能显示出相应层级,妨碍我们阅读项目,如何规定其按树状显示?2.解决2.1选择如图所示按键2.2找到PackagePresentation,并选择Hierarchical即树状显示即可......
  • 代码随想录算法训练营第三十三天 | 135. 分发糖果, 134. 加油站, 1005.K次取反后最大化
      1005.K次取反后最大化的数组和 已解答简单 相关标签相关企业 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。重复这个过程恰好 k 次。可以多次选择同一个下......
  • 代码随想录算法训练营第三十三天| ● 1005.K次取反后最大化的数组和 ● 134. 加油站
    K次取反后最大化的数组和 题目链接:1005.K次取反后最大化的数组和-力扣(LeetCode)思路:首先增序排序,然后依次将负值取反,如果负数先用完,则再排序一次,将最小的正数取反之后求和;如果k先用完,直接求和。注意sort默认是增序排序,若想要要降序,则不能使用sort(nums.end(),nums.begin())......
  • Vue 3.0 模板语法
    Vue.js使用了基于HTML的模板语法,允许开发者声明式地将DOM绑定至底层组件实例的数据。所有Vue.js的模板都是合法的HTML,所以能被遵循规范的浏览器和HTML解析器解析。在底层的实现上,Vue将模板编译成虚拟DOM渲染函数。结合响应性系统,Vue能够智能地计算出最少需要重新渲......
  • JAVA基础:引用类型参数传递的相关案例(数组的传递) 方法重载 return关键字
    packagecom.itheima.Method;publicclassMethod6{publicstaticvoidmain(String[]args){int[]arrs=newint[]{2,5,6,4};printArray(arrs);}publicstaticvoidprintArray(int[]arr){if(arr!=null){System.out......
  • SiteServer CMS远程模板下载getshell漏洞导致的黑SEO利用分析溯源
    前言某日中午,涉及一代理商客户网站发现异常SQ内容,要求进行溯源分析并找出根本原因。0x01初步分析通过提供的链接(www.xxx.com.cn/2023j19tPLKn2/55151),确认涉及黑帽SEO活动,通过百度搜索进一步验证也证实了这一点。0x02日志分析黑客常常在植入菠菜或非法广告的网站中设置后......
  • 模板记录
    RMQ求Lca怕考场被卡,所以临省选重新复习一下。有个性质:若\(u,v\)不成祖先和儿子关系,则\(u,v\)的\(lca\)的\(dfs\)序一定不在\(dfn_u\)到\(dfn_v\)之间,所以我们只用找到\(dfn_u\)到\(dfn_v\)之间深度最小点\(d\)的就行了,\(d\)的父亲显然是\(u,v\)的\(lca\)......
  • 在Keil中要将数组加载到指定的内存中
    在进行屏幕驱动移植时,源码中有一段这样的代码uint16_tltdc_lcd_framebuf[800][480]__attribute__((at(LCD_FRAME_BUF_ADDR)));在该工程下编译非常顺利,也不会提示有错误,但是在我自己新建的工程中使用就会出现错误提示,编译也不通过,提示.\Objects\GD32F470.axf:Error:L6406E......
  • 数组对象删除不满足某些条件的对象 js
    recursiveFunction(items,childrenNodeName,ids){console.log('items',ids);//获取数组长度if(items)items=[];letlen=items?.length//循环遍历数组for(leti=0;i<len;i++){//如果有子节点,递归遍历......
  • 树状数组学习笔记
    目录原理(结构)建树应用单点修改,区间求和区间修改,单点求值区间修改,区间求和单点修改,区间求最值求逆序对个数二维树状数组trick:树状数组上倍增权值树状数组正文1.原理引用日报图片。设黑色框内数组为\(a_1\toa_8\).可以推得\(c_i=a_......