社区讨论

萌新求助,最后三个点TLE(确信自己没写错

P3372【模板】线段树 1参与者 8已保存回复 18

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
18 条
当前快照
1 份
快照标识符
@mi7wgpcb
此快照首次捕获于
2025/11/21 04:44
4 个月前
此快照最后确认于
2025/11/21 06:33
4 个月前
查看原帖
CPP
summ = [0] * 400010
add = [0] * 400010

def update(x):
    summ[x] = summ[x << 1] + summ[x << 1 | 1]

def pushdown(x, tot):
    if add[x]:
        add[x << 1] += add[x]
        add[x << 1 | 1] += add[x]
        summ[x << 1] += (tot - (tot >> 1)) * add[x]
        summ[x << 1 | 1] += (tot >> 1) * add[x]
        add[x] = 0

def modify(now, nl, nr, ql, qr, val):
    if nl > qr or nr < ql:
        return
    if nl >= ql and nr <= qr:
        summ[now] = summ[now] + val * (nr - nl + 1)
        add[now] += val
        return
    pushdown(now, nr - nl +1)
    mid = nl + nr >> 1
    modify(now << 1, nl, mid, ql, qr, val)
    modify(now << 1 | 1, mid + 1, nr, ql, qr, val)
    update(now)
    
def query(now, nl, nr, ql, qr):
    if nl > qr or nr < ql:
        return 0
    if nl >= ql and nr <= qr:
        return summ[now]
    pushdown(now, nr - nl +1)
    mid = nl + nr >> 1
    return query(now << 1, nl, mid, ql, qr) + query(now << 1 | 1, mid + 1, nr, ql, qr)
    
n, m = map(int, input().split())
a = list(map(int,input().split()))
for i in range(1, n+1):
    modify(1, 1, n, i, i, int(a[i-1]))

for i in range(m):
    a = list(map(int,input().split()))
    if a[0] == 1:
        modify(1, 1, n, a[1], a[2], a[3])
    else:
        print(query(1, 1, n, a[1], a[2]))

回复

18 条回复,欢迎继续交流。

正在加载回复...