_囧囧_ 2021-04-08 22:14 采纳率: 0%
浏览 129

CCF 202012-5 星际旅行 使用树状数组,测试样例可以通过,0分

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)
  • 写回答

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)

    评论

报告相同问题?