树状数组的基本运用
来源:互联网 发布:国产电视知乎 编辑:程序博客网 时间:2024/05/22 11:54
给定n个数列,规定有两种操作,一是修改某个元素,二是求子数列[a,b]的连续和。数列的元素个数最多100000个,询问操作最多100000次。
第一行2个整数n,m(n表示输入n个数列,m表示有m个操作)
第二行输入n个数列。
接下来M行,每行有三个数k,a,b(k=0表示求子数列[a,b]的和,k=1表示第a个数列加b)
输出若干行数字,表示每次K=0时对应输出一个子数列[a,b]的连续和。
10 51 2 3 4 5 6 7 8 9 10 1 1 50 1 30 4 81 7 50 4 8
113035
本题为基础模板题。话不多说,粘上代码
1 //树状数组基本框架的搭建(维护和查询都是O(lgn)的复杂度) 2 #include<bits/stdc++.h> 3 using namespace std; 4 int tree[110000]; 5 int n,m; 6 7 int lowbit(int k) 8 { 9 return k&(-k);//把高位的"1"全部去掉 。 10 }11 12 void add(int k,int num)//在某个位置添加一个值,与他牵连的树状数组的值都要更新 13 {14 while(k<=n)15 {16 tree[k]+=num;17 k+=lowbit(k);18 }19 } 20 21 22 int Sum(int k)//求数组1~k的和 23 {24 int sum=0;25 while(k>0)26 {27 sum+=tree[k];28 k-=lowbit(k);29 }30 return sum;31 }32 33 34 int main()35 {36 cin>>n; cin>>m;37 int a;38 for(int i=1;i<=n;i++)39 {40 cin>>a;41 add(i,a);42 } 43 int k,x1,x2;44 for(int i=1;i<=m;i++)45 {46 cin>>k>>x1>>x2;47 if(k==1)48 add(x1,x2);49 if(k==0)50 cout<<Sum(x2)-Sum(x1-1)<<endl;51 }52 return 0;53 }
阅读全文
0 0
- 树状数组的基本运用
- poj 3067 树状数组的基本运用
- Hdu 1166 敌兵布阵(基本树状数组的运用)
- 树状数组的基本+运用(HDU1166-敌兵布阵)
- 树状数组的两种运用
- 树状数组的基本函数
- 树状数组的基本写法
- 树状数组的基本操作
- 树状数组运用
- 树状数组简单运用 hdu1166
- 树状数组基础及运用
- poj 2352 Stars (树状数组 +1 的运用)
- 编程学习笔记12--树状数组的运用
- hdu 1166 敌兵布阵 树状数组的运用
- 树状数组的进阶运用(Stars 数星星)
- 树状数组两种基本的模式
- 树状数组的两道基本题
- 树状菜单的运用
- 用C++实现双向链表
- poj 2104 K-th Number (主席树)
- 妙用Linux 的后台任务
- noip系列 2004提高组 合并果子
- BFC原理与清除浮动的关系
- 树状数组的基本运用
- 树状数组的基本+运用(HDU1166-敌兵布阵)
- linux-10 日志的管理
- 树状数组的进阶运用(Stars 数星星)
- 线段树的基础递归的使用
- windows下打包QT程序成安装包2
- 线段树的基础非递归的使用
- array_map
- 树状数组基本模版(区间更新,单点查询)