题解 P3374 【【模板】树状数组 1】
恩,这是AC的第一道树状数组呢。
本蒟蒻以前遇到RMQ问题一般都用线段树或ST表,可惜ST表不支持在线修改,而线段树代码量又太大。
如今终于找到了折中方案:树状数组!!!!
代码量小,还支持修改!
树状数组也就是二叉索引树,又被称为Fenwick树,然而我个人认为它不能被严谨地成为树,因为充其量只是借用的树形结构的思想,于实现上有着较大的区别。
树状数组虽然运用范围没有线段树那么广,但是它的效率要高很多,比如线段树是$nlogn$,但树状数组是$logn$。
还有一点需要注意的是:树状数组可以区间查询,但不能运用于任意区间查询。这一点在后面会提到。
那么这个树状数组的基本思路就是
用节点ci储存和,比如:
- c1=a1
- c2=a1+a2
- c3=a3
- c4=a1+a2+a3+a4
- c5=a5
- c6=a5+a6
- c7=a7
- c8=a1+...+a8
当然这样子可能不是很容易看出内在的联系,因此不妨将其转化为二进制来观察:
- c0001=a0001
- c0010=a0001+a0010
- c0011=a0011
- c0100=a0001+a0010+a0011+a0100
- c0101=a0101
- c0110=a0101+a0110
- c0111=a0111
- c1000=a0001+...+a1000
是不是发现了什么?
没有吗?好吧。
事实上这里的规律就是cn=a(n–2^k+1)+...+an,这里的k指的是n二进制末尾0的数量。
获取2^k的操作我们称之为lowbit,其实现如下:
int lowbit(int k){
return k&(-k);
}
有了lowbit操作之后,求和就很好写了:
int query(int x){
int ans=;
while(x!=){
ans+=tree[x];
x-=lowbit(x);
}
return ans;
}
要注意一点,这里求的ans是区间[1,x]的和,想要[y,x]的和只能$query(x)-query(y-1)$。
因此我们回到了之前那个问题:树状数组不能解决所有区间查询,它只能解决如上的有关联的区间查询。
emmmm.....还有update操作:
void update(int x,int k){
while(x<=n){
tree[x]+=k;
x+=lowbit(x);
}
}
这个在明白了树状数组的本质之后也很好理解,就不多做叙述了。
总的来说,树状数组挺好用的,值得一学。但切记,无论如何都必须掌握线段树,因为能用树状数组解决的都能用线段树,而反之不一定如此。
另附AC代码见下:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn=; int n,m;
int tree[maxn<<]; int lowbit(int k){
return k&(-k);
} void update(int x,int k){
while(x<=n){
tree[x]+=k;
x+=lowbit(x);
}
} int query(int x){
int ans=;
while(x!=){
ans+=tree[x];
x-=lowbit(x);
}
return ans;
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
int a;
scanf("%d",&a);
update(i,a);
}
for(int i=;i<=m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a==)update(b,c);
else printf("%d\n",query(c)-query(b-));
}
}
题解 P3374 【【模板】树状数组 1】的更多相关文章
- [模板] 树状数组 (C++ class)
闲来无事(其实是打了两三道树状数组题),写了个树状数组模板…… /* Author: hotwords */ template<typename tp> class BinTree { p ...
- HDU 1166 线段树模板&树状数组模板
HDU1166 上好的线段树模板&&树状数组模板 自己写的第一棵线段树&第一棵树状数组 莫名的兴奋 线段树: #include <cstdio> using nam ...
- 【洛谷 p3374】模板-树状数组 1(数据结构)
题目:已知一个数列,你需要进行下面两种操作:1.将某一个数加上x:2.求出某区间每一个数的和. 解法:树状数组求前缀和. #include<cstdio> #include<cstd ...
- 【洛谷 p3368】模板-树状数组 2(数据结构)
题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数数加上x:2.求出某一个数的和. 解法:树状数组+前缀和优化.数组中每位存和前一位的数的差,这样区间修改只用改两位,单点询问就是求前缀和 ...
- POJ2299逆序对模板(树状数组)
题目:http://poj.org/problem?id=2299 只能相邻两个交换,所以交换一次只会减少一个逆序对.所以交换次数就是逆序对数. ps:原来树状数组还可以记录后边lowbit位的部分和 ...
- 洛谷.3374.[模板]树状数组1(CDQ分治)
题目链接 简易CDQ分治教程 //每个操作分解为一个有序数对(t,p),即(时间,操作位置),时间默认有序,用CDQ分治处理第二维 //对于位置相同的操作 修改优先于查询 //时间是默认有序的 所以可 ...
- 牛客网 暑期ACM多校训练营(第一场)J.Different Integers-区间两侧不同数字的个数-离线树状数组 or 可持久化线段树(主席树)
J.Different Integers 题意就是给你l,r,问你在区间两侧的[1,l]和[r,n]中,不同数的个数. 两种思路: 1.将数组长度扩大两倍,for(int i=n+1;i<=2* ...
- CF459D Pashmak and Parmida's problem (树状数组)
Codeforces Round #261 (Div. 2) 题意:给出数组A,定义f(l,r,x)为A[]的下标l到r之间,等于x的元素数.i和j符合f(1,i,a[i])>f(j,n,a ...
- 【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)
题意:给2个数字序列 a 和 b ,问按从小到达排序后,a中的哪些子串与b的名次匹配. a 的长度 N≤100,000,b的长度 M≤25,000,数字的大小 K≤25. 解法:[思考]1.X 暴力. ...
- 离线树状数组 hihocoder 1391 Countries
官方题解: // 离线树状数组 hihocoder 1391 Countries #include <iostream> #include <cstdio> #include ...
随机推荐
- Git 环境安装
本文环境: 操作系统:Windows XP SP3 Git客户端:TortoiseGit-1.8.14.0-32bit 一.安装Git客户端 全部安装均采用默认! 1. 安装支撑软件 msysgit: ...
- 3dmax快速实现一个逼真地毯效果
3dsmax怎么制作逼真的毛绒地毯模型?3dsmax中想要中想要建模长方形的毛绒地毯,该怎么制作呢?下面我们就来看看详细的教程,需要的朋友可以参考下: 1.在创建面板-扩展基本体下选择切角长方体 2. ...
- mysql插入数据出现java.lang.NullPointerException
在写购物车持久层的时候,要进行测试的时候居然出现了空指针异常: 最后发现是测试类少了 @RunWith(SpringRunner.class)@SpringBootTest 如下是没改之前的测试类: ...
- 对同层数据进行处理,做成树状图形式的数据结构,并符合elementui中的tree结构
//通过子级的pid找到父级对应的id,制作树状图 var data = [ { id: 1, name: "办公管理", pid: 0 }, { id: 2, name: &qu ...
- BZOJ 4033[HAOI2015] 树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3188 Solved: 1366[Submit][Stat ...
- luogu P1869 愚蠢的组合数(质因数+瞎搞)
题意 n<=105 题解 一个数是不是偶数就是看有没有二这个质因子. 所以我们先预处理每个数的阶乘的二这个质因子的数量 然后按公式判断就行了. #include<iostream> ...
- 精品JS代码收藏大全
1. oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键 <table border oncontextmenu ...
- 如何成为一个偷懒又高效的Android开发人员
我敢肯定你对这个标题肯定心存疑惑,但事实就是如此,这个标题完全适合Android开发人员.据我所知, Android程序员不情愿写 findViewById().点击事件监听等重复率较高的代码.那我们 ...
- Ruby创建命令
Ruby创建命令
- Struts2学习(三)上传下载
今天记录一下利用struts2实现上传下载,借此案例说明一下struts2的开发流程. 须要注意的是struts2版本号不同非常多地方的写法是不同的.本例使用struts2.3.15 .有差别的地方文 ...