【高级数据结构其二·树状数组】

 

单点修改,区间查询

def lowbit(x):
    return x&-x
def add(x,d):
    while x<=N:
        tree[x]+=d
        x+=lowbit(x) #需要修改那个节点的值
def sum(x):
    ans=0
    while x>0:
        ans+=tree[x]
        x-=lowbit(x) #需要加上那个节点的值
    return ans
n=int(input())
N=100050
tree=[0]*N
a=[0]+list(map(int,input().split()))
m=int(input())
for i in range(1,n+1):
    add(i,a[i]) #初始化树状数组
for i in range(m):
    x,A,B=map(int,input().split())
    if x==1:
        add(A,B)
    else:
        print(sum(B)-sum(A-1))
#树状数组的修改和查询区间和的时间复杂度均为logn

区间修改、区间求和

def lowbit(x):
    return x&-x
def add1(x,d):
    while x<=N:
        tree1[x]+=d
        x+=lowbit(x)
def add2(x,d):
    while x<=N:
        tree2[x]+=d
        x+=lowbit(x)
def sum1(x):
    ans=0
    while x>0:
        ans+=tree1[x]
        x-=lowbit(x)
    return ans
def sum2(x):
    ans=0
    while x>0:
        ans+=tree2[x]
        x-=lowbit(x)
    return ans
N=100050
#两个树状数组
tree1=[0]*N #求修改区间,处理Di
tree2=[0]*N #求区间和,处理(i-1)Di
n,q=map(int,input().split())
old=0
a=[0]+list(map(int,input().split()))

for i in range(1,n+1):
    # 差分数组原理,初始化
    add1(i,a[i]-old)
    add2(i,(i-1)*(a[i]-old))
    old=a[i]

for i in range(q):
    s=list(map(int,input().split()))
    L,R=s[1],s[2]
    if s[0]==1:#区间修改
        d=s[3]
        add1(L,d)
        add1(R+1,-d)
        add2(L,d*(L-1))
        add2(R+1,-d*R)
    else:#树状数组区间求和公式
        print(R*sum1(R)-sum2(R)-(L-1)*sum1(L-1)+sum2(L-1))

你可能感兴趣的:(数据结构,python,算法)