1.。。树状数组前缀和
2.。。.求逆序对的数量
来源:杭电算法培训进阶班
基本思想:
开一个数组c[n+1],初始化为0,记录前面数据的出现情况;当数据a出现时,就令c[a]=1。这样的话,若求a得逆序数,只需要算出在当前状态下c[a+1,n];中由多少个1,因为这些位置的数在a之前出现且比a大。
区间求和用树状数组来算更高效!!!!!
另开一个树状数组d[n+1],初始化为0,d[i]记录i结点所管辖范围内当前状态有多少个数;
当添加数据a时,就向上更新d数组,这样,当求a得逆序数时,只需要算sum(n)-sum(a)即可;
3 . 树状差分数组
区间修改+单点查询的树状数组。
N个气球排成一排,从左到右依次编号为1,2,3···,N. 每次给定2个整数a和b(a<=b),表示从气球a到气球b依次给每个气球涂一次颜色。
但是,N次以后忘记了每个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?
基本思路:
用树状差分数组来写。
#include <iostream>
using namespace std;
//单点查询(因为差分,所以单点值即前缀和)
int ask(int p){
int res=0;
while(p) res+=c[p],p-=p&-p;
return res;
}
int main(){
return 0;
}
4。张萱得金箍棒是由N段相同长度得金属棒连接而成(最开始每段金属棒的价值都是1,从1到N编号);
张宣作为金箍棒的主人,可以对金箍棒任意一段施展魔法操作,每次操作就是将一段连续的金箍棒(从X编号到Y),每一段都增加价值Z(Z为1,2,3三种)。
现在,想知道执行M次操作后某一段金箍棒的总值。
基本思路:
区间修改+区间查询的树状数组。