from copy import deepcopy
import math
# e.g. lowbit = [0, 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, 16, 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, 32]
lowbit = [num & -num for num in range(1000000)]
def sum(var):
x, y, z = 0, 0, 0
while var > 0:
x += C[var][0]
y += C[var][1]
z += C[var][2]
var -= lowbit[var]
return x, y, z
def add(l, r, a, b, c):
for i in range(l, r + 1):
A[i][0] += a
A[i][1] += b
A[i][2] += c
j = i
while j <= N:
C[j][0] += a
C[j][1] += b
C[j][2] += c
j += lowbit[j]
def multiply(l, r, k):
for i in range(l, r + 1):
A[i] = [_ * k for _ in A[i]]
j = i
while j <= N:
C[j][0] = C[j][0] + A[i][0] / k * ( k - 1)
C[j][1] = C[j][1] + A[i][1] / k * ( k - 1)
C[j][2] = C[j][2] + A[i][2] / k * ( k - 1)
j += lowbit[j]
def transpose(l, r):
for i in range(l, r + 1):
P = deepcopy(A[i])
A[i][0], A[i][1], A[i][2] = A[i][1], A[i][2], A[i][0]
j = i
while j <= N:
C[j][0] = C[j][0] - P[0] + A[i][0]
C[j][1] = C[j][1] - P[1] + A[i][1]
C[j][2] = C[j][2] - P[2] + A[i][2]
j += lowbit[j]
if __name__ == '__main__':
N, M = list(map(int, input().split()))
# 初始化A数组 C数组的值
A = [[0, 0, 0] for i in range(N + 1)]
C = [[0, 0, 0] for i in range(N + 1)]
for i in range(M):
slist = list(map(int, input().split()))
opt = slist[0]
if opt == 1: # 代表这次操作需要将第l个数到第r个数中v的倍数除以v
l, r, a, b, c = slist[1], slist[2], slist[3], slist[4], slist[5]
add(l, r, a, b, c)
elif opt == 2:
l, r, k = slist[1], slist[2], slist[3]
multiply(l, r, k)
elif opt == 3:
l, r = slist[1], slist[2]
transpose(l, r)
else:
l, r = slist[1], slist[2]
x1, y1, z1 = sum(r)
x2, y2, z2 = sum(l - 1)
x, y, z = x1 - x2, y1 - y2, z1 - z2
print(int(math.pow(x, 2) + math.pow(y, 2) + math.pow(z, 2)) % 1000000007)CCF 202012-5 星际旅行 使用树状数组,测试样例可以通过,0分
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
_囧囧_ 2021-04-10 16:13关注问题在于:print(int(math.pow(x, 2) + math.pow(y, 2) + math.pow(z, 2)) % 1000000007)
应该使用x * x 而不是 math.pow(x, 2)
评论 打赏 举报解决 1无用