题目描述

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

  • 将某一个数加上 xx

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

输入格式

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

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

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

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

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

输出格式

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

输入输出样例

输入

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

输出

14
16

说明/提示

【数据范围】

对于 30\%30% 的数据,1 \le n \le 81≤n≤8,1\le m \le 101≤m≤10;
对于 70\%70% 的数据,1\le n,m \le 10^41≤n,m≤104;
对于 100\%100% 的数据,1\le n,m \le 5\times 10^51≤n,m≤5×105。

样例说明:

故输出结果14、16

思路

树状数组单点修改

这里有一个很关键的东西,叫做lowbit,lowbit是将一个二进制数的所有高位一都去掉,只留下最低位的1,比如lowbit(5)= lowbit(0101)= 0001

而如果改变x的值,就要加上自己的lowbit,一直加到n,这些节点都要加,比如一共有8个数第3个数要加上k,那么c[0011]+=k;

c[0011+0001] (c[0100])+=k;

c[0100+0100] (c[1000])+=k;

这样就能维护树状数组

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

树状数组区间查询

就是前缀和,比如查询x到y区间的和,那么就将从1到y的和 - 从1到x的和。

从1到y的和求法是,将y转为2进制,然后一直减去lowbit(y),一直到0

比如求1到7的和

ans+=c[0111];
ans+=c[0111-0001(0110)];
ans+=c[0110-0010(0100)];
ans+=c[0100-0100(c[0]无意义,结束)]int sum(int x){int ans=0;while(x!=0){ans+=tree[x];x-=lowbit(x);}return ans;}

树状数组单点查询

从x点,一直x-=lowbit(x),沿途都加上

    int search(int x){int ans=0;while(x!=0){ans+=tree[x];x-=lowbit(x);}return ans;}

代码

#include<iostream>
#include<iomanip>
#include<algorithm>
#include<math.h>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<queue>
using namespace std;
int const N = 5e5 + 5;
int c[N], n;
int lowbit(int x)
{return x & -x;
}
int ask(int x)
{int res = 0;for (; x; x -= lowbit(x)){res += c[x];}return res;
}
void update(int x, int d)
{for (; x <= n; x += lowbit(x)){c[x] += d;}return;
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);int m;cin >> n >> m;for (int i = 1; i <= n; ++i){int t;cin >> t;update(i, t);}for (int i = 1; i <= m; ++i){int o;cin >> o;if (o == 1){int x, k;cin >> x >> k;update(x, k);}else{int l, r;cin >> l >> r;cout << ask(r) - ask(l - 1) << endl;}}return 0;
}

洛谷 - P3374 树状数组1相关推荐

  1. 洛谷 P3374 树状数组模板1

    题目大意 给出一个初始数组,有两种操作,一种是将第x个数加上k,一种是求[x,y]区间和. 题目分析 直接暴力肯定TLE,我们可以用简单线段树或者树状数组优化,这里作者就采用简单线段树通过 #incl ...

  2. 洛谷.P3374 树状数组

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某一个数加上 x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n,m分别表示该数列数字的个数和操作的总个数. 第二行包含 n 个用 ...

  3. 洛谷P3374 树状数组模版1

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  4. 树状数组入门——以洛谷3374为例

    树状数组入门 含义:顾名思义,用树状表示的数组 功能:是一个查询和修改复杂度都为log(n)的数据结构.主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值:经过简单修改可以在log( ...

  5. 洛谷[P3374] [P3368]树状数组(线段树解法)

    最近学习了线段树,不会树状数组,用线段树舔着脸来做一下 P3374树状数组1https://www.luogu.com.cn/problem/P3374 ac代码 #include<bits/s ...

  6. 洛谷P3374 【模板】树状数组 1

    题目链接:[模板]树状数组 1 - 洛谷 模板题就不多说了 ac代码: #include <cstdio> #include <iostream> #include <a ...

  7. 洛谷P3688/uoj#291. [ZJOI2017]树状数组

    传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...

  8. 洛谷P5069 [Ynoi2015]纵使日薄西山(树状数组,set)

    洛谷题目传送门 一血祭 向dllxl致敬! 算是YNOI中比较清新的吧,毕竟代码只有1.25k. 首先我们对着题意模拟,寻找一些思路. 每次选了一个最大的数后,它和它周围两个数都要减一.这样无论如何, ...

  9. (树状数组+逆元)洛谷P5142 区间方差

    洛谷P5142 区间方差 (^ w ^) 题目背景 出题人并没有能力写有趣的题面-- 题目描述 对于一个长度为n的序列a1,a2,a3⋯ana_1,a_2,a_3\cdots a_na1​,a2​,a ...

最新文章

  1. 批量修改多目录下相同文件名的文件内容
  2. [USACO06NOV]玉米田Corn Fields(动态规划,状态压缩)
  3. (1.2)HarmonyOS鸿蒙config.json
  4. 沈向洋离开微软,曾是华人在美科技圈最高级高管,畅谈职业生涯的 7 堂课!...
  5. python 下载或者直接读取csv文件
  6. mysql5.7安装教程centos_CentOS7下MySQL5.7安装配置方法图文教程(YUM)
  7. 红帽认证是什么?含金量如何?
  8. 高等数学张宇18讲 第四讲 一元函数微分学的几何应用
  9. canvas 绘画
  10. 链表:头插法与尾插法(简易图解和代码)
  11. poi生成pptx文件以及背景颜色或者背景图片的设置
  12. 64位计算机可以装32位的系统么,电脑是要装32位还是64位系统?
  13. 交叉熵、KL散度、Jeffery分歧、JS散度
  14. STM32 SHT10温湿度传感器的信号采集
  15. PostgreSQL 数据库查询
  16. 看到了便有增加福慧机会的好文
  17. 小程序转uni-app——条件判断包含中文
  18. 蓝桥杯python 基础练习3 字母图形
  19. Microbit试题
  20. CentOS软件包管理

热门文章

  1. 论文阅读: [3d]Audio-driven Talking Face Video Generation with Learning-based Personalized Head Pose
  2. html静态网站中华传统文化网站主题设计 传统文化艺术耍牙15页
  3. 十六进制颜色值和ARGB颜色值的转换
  4. 野蛮时代SLG数据分析报告
  5. vue + vuex 实现评论和回复
  6. catia利用宏批量改名的方法_CATIA批量改名功能大揭秘
  7. Chrome浏览器快速切换DOH DNS
  8. os系统解决seaborn中文乱码问题 Font family [‘SiHei‘] not found
  9. Python字符串切片总结
  10. Git commit (amend)