洛谷 - P3374 树状数组1
题目描述
如题,已知一个数列,你需要进行下面两种操作:
将某一个数加上 xx
求出某区间每一个数的和
输入格式
第一行包含两个正整数 n,mn,m,分别表示该数列数字的个数和操作的总个数。
第二行包含 nn 个用空格分隔的整数,其中第 ii 个数字表示数列第 ii 项的初始值。
接下来 mm 行每行包含 33 个整数,表示一个操作,具体如下:
1 x k
含义:将第 xx 个数加上 kk2 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相关推荐
- 洛谷 P3374 树状数组模板1
题目大意 给出一个初始数组,有两种操作,一种是将第x个数加上k,一种是求[x,y]区间和. 题目分析 直接暴力肯定TLE,我们可以用简单线段树或者树状数组优化,这里作者就采用简单线段树通过 #incl ...
- 洛谷.P3374 树状数组
题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某一个数加上 x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n,m分别表示该数列数字的个数和操作的总个数. 第二行包含 n 个用 ...
- 洛谷P3374 树状数组模版1
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...
- 树状数组入门——以洛谷3374为例
树状数组入门 含义:顾名思义,用树状表示的数组 功能:是一个查询和修改复杂度都为log(n)的数据结构.主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值:经过简单修改可以在log( ...
- 洛谷[P3374] [P3368]树状数组(线段树解法)
最近学习了线段树,不会树状数组,用线段树舔着脸来做一下 P3374树状数组1https://www.luogu.com.cn/problem/P3374 ac代码 #include<bits/s ...
- 洛谷P3374 【模板】树状数组 1
题目链接:[模板]树状数组 1 - 洛谷 模板题就不多说了 ac代码: #include <cstdio> #include <iostream> #include <a ...
- 洛谷P3688/uoj#291. [ZJOI2017]树状数组
传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...
- 洛谷P5069 [Ynoi2015]纵使日薄西山(树状数组,set)
洛谷题目传送门 一血祭 向dllxl致敬! 算是YNOI中比较清新的吧,毕竟代码只有1.25k. 首先我们对着题意模拟,寻找一些思路. 每次选了一个最大的数后,它和它周围两个数都要减一.这样无论如何, ...
- (树状数组+逆元)洛谷P5142 区间方差
洛谷P5142 区间方差 (^ w ^) 题目背景 出题人并没有能力写有趣的题面-- 题目描述 对于一个长度为n的序列a1,a2,a3⋯ana_1,a_2,a_3\cdots a_na1,a2,a ...
最新文章
- 批量修改多目录下相同文件名的文件内容
- [USACO06NOV]玉米田Corn Fields(动态规划,状态压缩)
- (1.2)HarmonyOS鸿蒙config.json
- 沈向洋离开微软,曾是华人在美科技圈最高级高管,畅谈职业生涯的 7 堂课!...
- python 下载或者直接读取csv文件
- mysql5.7安装教程centos_CentOS7下MySQL5.7安装配置方法图文教程(YUM)
- 红帽认证是什么?含金量如何?
- 高等数学张宇18讲 第四讲 一元函数微分学的几何应用
- canvas 绘画
- 链表:头插法与尾插法(简易图解和代码)
- poi生成pptx文件以及背景颜色或者背景图片的设置
- 64位计算机可以装32位的系统么,电脑是要装32位还是64位系统?
- 交叉熵、KL散度、Jeffery分歧、JS散度
- STM32 SHT10温湿度传感器的信号采集
- PostgreSQL 数据库查询
- 看到了便有增加福慧机会的好文
- 小程序转uni-app——条件判断包含中文
- 蓝桥杯python 基础练习3 字母图形
- Microbit试题
- CentOS软件包管理
热门文章
- 论文阅读: [3d]Audio-driven Talking Face Video Generation with Learning-based Personalized Head Pose
- html静态网站中华传统文化网站主题设计 传统文化艺术耍牙15页
- 十六进制颜色值和ARGB颜色值的转换
- 野蛮时代SLG数据分析报告
- vue + vuex 实现评论和回复
- catia利用宏批量改名的方法_CATIA批量改名功能大揭秘
- Chrome浏览器快速切换DOH DNS
- os系统解决seaborn中文乱码问题 Font family [‘SiHei‘] not found
- Python字符串切片总结
- Git commit (amend)