Я пытаюсь решить эту проблему в Hackerearth с деревом сегментов.
вот мой код в python
def update(current,start,end,l,r,value,tree,lazy):
if lazy[current]!=0:
tree[current]+=lazy[current]
if start !=end:
lazy[2*current+1]+=lazy[current]
lazy[2*current+2]+=lazy[current]
lazy[current]=0
if start>end or r<start or l>end:
return 0
if start>=l and end<=r:
tree[current]=value
if start!=end:
lazy[2*current+1]+=value
lazy[2*current+2]+=value
return 0
mid=(start+end)//2
update(2*current+1,start,mid,l,r,value,tree,lazy)
update(2*current+2,mid+1,end,l,r,value,tree,lazy)
tree[current]=max(tree[2*current+1],tree[2*current+2])
return 0
def query(current,start,end,l,r,tree,lazy):
if start>end or r<start or l>end:
return 0
if lazy[current]!=0:
tree[current]+=lazy[current]
if start!=end:
lazy[2*current+1]+=lazy[current]
lazy[2*current+2]+=lazy[current]
lazy[current]=0
if start>=l and end<=r:
return tree[current]
mid=(start+end)//2
return max(query(2*current+1,start,mid,l,r,tree,lazy),query(2*current+2,mid+1,end,l,r,tree,lazy))
from collections import deque
tree=deque()
tree.extend([0]*2000001)
lazy=deque()
lazy.extend([0]*2000001)
n=int(input())
for _ in range(n):
l,h,p,c,x=map(int,input().split( ))
maximum=query(0,0,200000,x,x+l-1,tree,lazy)
if c:
update(0,0,200000,x,x+l-1,maximum+1,tree,lazy)
update(0,0,200000,x+p-1,x+p-1,maximum+1+h,tree,lazy)
else:
q=query(0,0,200000,x+p-1,x+p-1,tree,lazy)
if maximum-q>=h:
update(0,0,200000,x,x+l-1,maximum+1,tree,lazy)
else:
update(0,0,200000,x,x+l-1,q+h+1,tree,lazy)
print(tree[0])
Я использовал дерево сегментов с ленивым распространением, но все же, это дает TLE
Если я отправляю этот код в C или C ++, тогда он работает нормально.
Что не так в моем коде ?? Кто-нибудь ??