| 试题编号: | 201709-5 |
| 试题名称: | 除法 |
| 时间限制: | 10.0s |
| 内存限制: | 256.0MB |
| 问题描述: | 问题描述 小葱喜欢除法,所以他给了你N个数a1, a2, ?, aN,并且希望你执行M次操作,每次操作可能有以下两种: 输入格式 第一行两个整数N, M,代表数的个数和操作的次数。 输出格式 对于每一次的第二种操作,输出一行代表这次操作所询问的值。 样例输入 5 3 样例输出 15 评测用例规模与约定 对于30%的评测用例,1 ≤ N, M ≤ 1000; |
50分代码(运行超时,树形数组)
n, m = list(map(int, input().split()))
a = list(map(int, input().split()))
a.insert(0,0)
tree = [0] * (n+1) # 树形数组,注意数组要从1开始
def lowbit(x): # 计算2^k的值(其中k为x的二进制中从最低到高位连续0的长度)return (-x) & xdef update(x, y, n): # 单点更新'''x为更新的位置,y为更新后的值,n为数组个数tree[i] = A[i+1-2^k]+A[i+2-2^k]+...+A[i]'''i = xwhile i < n:tree[i] += yi += lowbit(i)def getsum(i): # 单点更新的逆操作ans = 0while i > 0:ans += tree[i]i -= lowbit(i)return ans# 初始化树形数组
for i in range(1, n+1):update(i, a[i], n+1)result = []
for i in range(m):temp = list(map(int, input().split()))op, l, r = temp[0], temp[1], temp[2]if op == 2:ans = getsum(r) - getsum(l-1) # 求l到r的和result.append(ans)elif op == 1:v = temp[3]if v == 1:continuefor i in range(l, r+1):if a[i] >= v and a[i] % v == 0:update(i, -(a[i] - a[i]//v), n+1) # 注意这里的y为:tree[i]=tree[i]-a[i]+a[i]/va[i] = a[i] // v
for i in result:print(i)