社区讨论
萌新求助,最后三个点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 条回复,欢迎继续交流。
正在加载回复...