博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P3374 【模板】树状数组 1(单点加,区间和)
阅读量:4319 次
发布时间:2019-06-06

本文共 1031 字,大约阅读时间需要 3 分钟。

题目链接

树状数组

树状数组最基本的就是求区间和。

维护:

  • 空间复杂度:O(n)
  • 时间复杂度(区间和,单点修改):

    修改:O(logn)

    查询:O(logn)

用c[i]表示(i-lowbit[i]+1,i)区间的和。

查询时,用到前缀和的思想,(i,j)=c[j]-c[i-1]。

优点

代码简单

缺点

难理解

代码(解析)

1 #include
2 #include
3 using namespace std; 4 const int maxn=500005; 5 int n,m; 6 int c[maxn]; 7 int lowbit(int x){
//求对应数字的二进制的从后往前的第一个1。 8 return x&(-x);//例如:6(110)->lowbit(6)=2;12(1100)->lowbit(12)=4 9 }10 void update(int x,int v){
//初始化和更新 11 for(int i=x;i<=n;i+=lowbit(i)){
//自己手画一下 12 c[i]+=v;13 }14 }15 int query(int x){ //查询:和更新很像,像是互逆的 16 int res=0;17 for(int i=x;i>0;i-=lowbit(i)) res+=c[i];18 return res;19 }20 int main()21 {22 cin>>n>>m;23 for(int i=1;i<=n;i++){24 int v;25 scanf("%d",&v);26 update(i,v);27 }28 for(int i=1;i<=m;i++){29 int k,x,y;30 scanf("%d%d%d",&k,&x,&y);31 if(k==1) update(x,y);32 if(k==2) cout<
<

 

转载于:https://www.cnblogs.com/yinyuqin/p/10961243.html

你可能感兴趣的文章
Win form碎知识点
查看>>
避免使用不必要的浮动
查看>>
第一节:ASP.NET开发环境配置
查看>>
sqlserver database常用命令
查看>>
rsync远程同步的基本配置与使用
查看>>
第二天作业
查看>>
访问属性和访问实例变量的区别
查看>>
Spring MVC 异常处理 - SimpleMappingExceptionResolver
查看>>
props 父组件给子组件传递参数
查看>>
【loj6038】「雅礼集训 2017 Day5」远行 树的直径+并查集+LCT
查看>>
十二种获取Spring的上下文环境ApplicationContext的方法
查看>>
UVA 11346 Probability 概率 (连续概率)
查看>>
linux uniq 命令
查看>>
Openssl rand命令
查看>>
HDU2825 Wireless Password 【AC自动机】【状压DP】
查看>>
BZOJ1015: [JSOI2008]星球大战starwar【并查集】【傻逼题】
查看>>
HUT-XXXX Strange display 容斥定理,线性规划
查看>>
mac修改用户名
查看>>
一道关于员工与部门查询的SQL笔试题
查看>>
Canvas基础
查看>>