1.单点修改 voidadd(intx,intk){while(x <= n) { tree[x] += k; x +=lowbit(x); } } 因为树状数组是牵一发而动全身,所以一直lowbit即可,这个过程正是我之前所模拟的算式。你想啊要是A[1]要加k, 那么是不是后面要用到A[1]的都得加k!就是这个理! 2.区间查询 就是前缀和,比如查询x到y区间的和,那么
ll a[N];intn,m;voidadd_dandian(intx,intk){for(inti=x;i<=n;i+=lowbit(i)){ a[i]+=k; } }llquery(intl,intr){//查询[l,r]的和ll ans=0;for(inti=r;i;i-=lowbit(i)){ ans+=a[i]; }for(inti=l-1;i;i-=lowbit(i)){ ans-=a[i]; }returnans; }voidsolve(){ cin>>n...
2.区间修改 && 单点查询 已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x; 2.求出某一个数的值. 对A[]建一个差分数组P[i]=A[i]-A[i-1] 那么A[i]=P[1]+P[2]+…+P[i],这串求和就可以用树状数组实现了,用bits[]建树状数组,实现对P数组的求和,区间修改时,对left~right...
树状数组 https://oi-wiki.org/ds/fenwick/ 题目描述 这是一道模板题。 给出一个 n×m 的零矩阵 A,你需要完成如下操作: 1 x y k:表示元素 A_{x,y} 自增 k; 2 a b c d:表示询问左上角为 (a,b),右下角为 (c,d) 的子矩阵内所有数的和。 输入格式 输入的第一行有两个正整数 n, m;接...
#include<bits/stdc++.h>usingnamespacestd;intn,m,scan[500009],num[500009],nl[500009];intlowbit(intx){returnx&-x;}voidadd(intx,intw){for(inti=x;i<=n;i+=lowbit(i)){num[i]+=w;}}intsum(intx){intans=0;for(inti=x;i>=1;i-=lowbit(i)){ans+=num[i];}returnans;}voidcf()...
创客家题库 主页 问题 来源/分类 题单 竞赛&作业 状态 排名 常见问答 登录 注册 3394: 二维树状数组 1:单点修改,区间查询 内存限制:256 MB 时间限制:1.000 S 评测方式:文本比较 命题人:外部导入 提交:0 解决:0 提交提交记录统计露一手! 题目描述 这是一道模板题。给出一个 n×m 的零矩阵 A,你需要完成...
树状数组(Binary Indexed Tree(BIT), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构。 目录 一.概念 二.操作 三.二维树状数组 四.题集 一.概念 树状数组主要是维护一段区间的修改和查询; 经过简单修改可以在log(n)的复杂度下进行范围修改,但是一般只能修改一个元素的值,处理后可以实现区间修改;...
题目地址:https://www.luogu.org/problemnew/show/P3368 题目: 《算法笔记》那本书最后几页有介绍这种问题,但是我按照那种思路写不出来。。太弱了。。不懂 网上都是下面这种代码,目前树状数组一知半解吧,先暂时记住。 ac代码: ... 查看原文 对顶堆 ...
1.单点修改 void add(int x, int k) { while (x <= n) { tree[x] += k; x += lowbit(x); } } 1. 2. 3. 4. 5. 6. 7. 8. 因为树状数组是牵一发而动全身,所以一直lowbit即可,这个过程正是我之前所模拟的算式。你想啊要是A[1]要加k, 那么是不是后面要用到A[1]的都得加k!就是...
树状数组 https://oi-wiki.org/ds/fenwick/ 题目描述 这是一道模板题。 给出一个 n×m 的零矩阵 A,你需要完成如下操作: 1 x y k:表示元素 A_{x,y} 自增 k; 2 a b c d:表示询问左上角为 (a,b),右下角为 (c,d) 的子矩阵内所有数的和。 输入格式 输入的第一行有两个正整数 n, m; ...