求求管理员关爱py选手
查看原帖
求求管理员关爱py选手
335584
wyx_150137楼主2020/10/9 12:44

求求管理员把 python 的时限放大一点

我以为是我写的问题

后来发现 py都是 70 分 QAQQAQQAQQAQ

裤料

放份代码 证明真的是py选手

import sys
N = int(1e5 + 5)
M = N << 2
a = [0 for i in range(0, N)]
tr = [0 for i in range(0, M)]
lazy = [0 for i in range(0, M)]

def update(k):
	tr[k] = tr[k << 1] + tr[k << 1 | 1]

def build(k,l,r):
	if(l == r) :
		tr[k] = a[l]
		return
	mid = (l + r) >> 1
	build(k << 1, l, mid)
	build(k << 1|1, mid + 1, r)
	update(k)
	return 

def solve(k,l,r,val):
	lazy[k] += val
	tr[k] += (r - l + 1) * val
	 

def down(k, l, r):
	mid = (l + r) >> 1
	solve(k << 1, l, mid, lazy[k])
	solve(k << 1|1, mid + 1, r, lazy[k])
	lazy[k] = 0
	pass

def change(k, l, r, x, y, val):
	if(x <= l and r <= y):
		solve(k, l, r, val)
		return 
	if(lazy[k] != 0):
		down(k, l, r)
	mid = (l + r) >> 1
	if(x <= mid):
		change(k << 1, l, mid, x, y, val)
	if(y > mid):
		change(k << 1 | 1, mid + 1, r, x, y, val)
	update(k)

def ask(k, l, r, x, y):
	if(x <= l and r <= y):
		return tr[k]
	if(lazy[k] != 0) :
		down(k, l, r)
	mid = (l + r) >> 1
	ans = 0
	if(x <= mid):
		ans += ask(k << 1, l, mid, x, y)
	if(y > mid):
		ans += ask(k << 1|1, mid + 1, r, x, y)
	return ans

s = input().split()
n = int(s[0]) 
m = int(s[1])
A = input().split()
for i in range(0, n):
	a[i + 1] = int(A[i])

build(1, 1, n)

#print(tr[1:(n<<2)+1])

for i in range(0, m):
	temp = input().split()
	if(temp[0][0] == '1') :
		X = int(temp[1]); Y = int(temp[2]); K = int(temp[3]);
		change(1,1,n,X,Y,K)
	else :
		X = int(temp[1]); Y = int(temp[2]); 
	#	print(X, Y)
		print(ask(1,1,n,X,Y))

2020/10/9 12:44
加载中...