【数据结构】树状数组模板--CODE[VS] 1080线段树练习and1081线段树练习2
来源:互联网 发布:淘宝订单不能评价 编辑:程序博客网 时间:2024/05/01 17:10
CODE[VS] 1080 : 点击进入魔塔第一层
CODE[VS] 1081 : 点击进入魔塔第二层
树状数组是个好东西,常数比线段树小,代码比线段树简单
基于区间加法,资磁区间求和,区间修改,单点查询,单点修改,区间查询………
关于lowbit数组,这是一个非常神奇的东西,很难想象第一个想到这样来给数组划分的人时怎么想到的
lowbit[i]存的是某一个数,取其二进制最一个1所在位置的数,显然奇数lowbit == 1
每次修改区间沿着lowbit方向,每次查询逆lowbit方向
更详细的说明可以参见刘汝佳的《算法竞赛入门经典》一书或其他神犇的Blog
线段树练习(区间求和,单点修改)
#include <cstdio>#include <iostream>using namespace std;int n, m; int a[100001]; int lowbit(int x) { return x&(-x); } void update(int x, int num) { while(x<=n) { a[x]+=num; x+=lowbit(x); } } int sum(int x) { int sum=0; while(x>0) { sum+=a[x]; x-=lowbit(x); } return sum; } int main() { int i,j,temp; int a,x,y; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&temp); update(i,temp); } scanf("%d",&m); for(i=1;i<=m;i++) { scanf("%d%d%d",&a,&x,&y); if(a==1) update(x, y); else printf("%d\n",sum(y)-sum(x-1)); } return 0; }
线段树练习2(区间修改,单点查询)
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cstdlib>const int maxn = 100005;using namespace std;int n,q;int c[maxn];int b[maxn];int lowbit(int x){ return x&(-x);} inline void add(int i,int num){ while(i <= n) { c[i] += num; i += lowbit(i); }}inline int sum(int x){ int tot = 0; while(x > 0) { tot += c[x]; x -= lowbit(x); } return tot;}int main(){ scanf("%d",&n); for(int i =1;i <=n;i++) { int x; scanf("%d",&x); add(i,x); } scanf("%d",&q); for(int i = 1;i <= q;i++) { int cz; int aa,bb,xx,ii; scanf("%d",&cz); if(cz == 1) { scanf("%d%d%d",&aa,&bb,&xx); for(int j = aa;j <= bb;j++) { add(j,xx); } } if(cz == 2) { scanf("%d",&ii); printf("%d\n",sum(ii)-sum(ii-1)); } }return 0;}
JOJO : DIO你要干什么?!
DIO : 我不打线段树了JOJO!
THE END
By Peacefuldoge
http://blog.csdn.net/loi_peacefuldog
1 0
- 【数据结构】树状数组模板--CODE[VS] 1080线段树练习and1081线段树练习2
- 【CODE[VS]】1082 线段树练习 3 树状数组
- Code Vs 1081 线段树练习 2
- [树状数组][codevs1081]线段树练习2
- [树状数组]code[vs] 1082——线段树练习 3
- 【code[vs]】1082 线段树练习 3 树状数组区间修改、区间查询
- Code Vs 1082 线段树练习 3
- 形形色色的线段树练习——codevs线段树练习1-5:线段树,树状数组及分块模板
- codevs1080线段树练习(树状数组)
- Codevs_P1080 线段树练习(树状数组)
- 线段树练习_codevs1080_树状数组
- 线段树练习五(+树状数组)
- Codevs1082 线段树练习三(树状数组)
- codevs 1080_线段树练习_树状数组
- codevs1081线段树练习2(树状数组)
- 【CodeVS】1080 线段树练习 分块 线段树 树状数组 开放性
- Codevs 1080 线段树练习(线段树&&树状数组&&分块&&CDQ分治)
- Codevs 1081 线段树练习 2(线段树&&树状数组&&分块)
- 求一个n*m阶矩阵中为1的矩阵最大面积
- 简单介绍C语言中的回调函数
- 架设tomcat服务器遇到的问题
- JS组件系列——两种bootstrap multiselect组件大比拼
- eclipse安装插件提示 is not a valid repository location
- 【数据结构】树状数组模板--CODE[VS] 1080线段树练习and1081线段树练习2
- centos7 yum 方式安装nginx
- 读取xml文件
- myeclipse插件—SVN分支与合并详解【图】
- flex 布局下关于容器内成员 flex属性的理解
- Android 沉浸式statusbar (5.0以上无阴影,statusbar背景全透明)
- 译码器的应用
- [noip2008tg] 笨小猴
- iOS 线程队列