请问python有可能过后三个测试点吗
查看原帖
请问python有可能过后三个测试点吗
342659
SuSlim楼主2022/7/24 13:34
from typing import List
from typing import Callable, Any

class SegTree:
    class STNode:
        def __init__(self,cl,cr,val=0) -> None:
            self.cl,self.cr,self.val=cl,cr,val
            self.left,self.right,self.lazy=None,None,0
    def __init__(self,fr,to,cal:Callable[[int],Any]) -> None:
        def dfs(root,fr,to):
            root=self.STNode(fr,to)
            if fr==to:
                root.val=cal(fr)
            else:
                m=(fr+to)//2
                root.left=dfs(root.left,fr,m)
                root.right=dfs(root.right,m+1,to)
                root.val=root.left.val+root.right.val
            return root
        self.root=dfs(None,fr,to)
    def query(self,fr,to):
        def dfs(root,fr,to):
            if root.lazy!=0:
                self.push_down(root)
            if root.cl==fr and root.cr==to:
                return root.val
            cm=(root.cl+root.cr)//2
            if to<=cm:
                return dfs(root.left,fr,to)
            elif fr>cm:
                return dfs(root.right,fr,to)
            else:
                return dfs(root.left,fr,cm)+dfs(root.right,cm+1,to)
        return dfs(self.root,fr,to)
    def modify(self,fr,to,offset):
        def dfs(root,fr,to):
            if root.cl==fr and root.cr==to:
                root.val+=(root.cr-root.cl+1)*offset
                root.lazy+=offset
                return
            if root.lazy!=0:
                self.push_down(root)
            cm=(root.cl+root.cr)//2
            if to<=cm:
                dfs(root.left,fr,to)
            elif fr>cm:
                dfs(root.right,fr,to)
            else:
                dfs(root.left,fr,cm)
                dfs(root.right,cm+1,to)
            root.val=root.left.val+root.right.val
        return dfs(self.root,fr,to)
    def push_down(self,root:STNode):
        if root.cl!=root.cr:
            root.left.val+=(root.left.cr-root.left.cl+1)*root.lazy
            root.right.val+=(root.right.cr-root.right.cl+1)*root.lazy
            root.left.lazy+=root.lazy
            root.right.lazy+=root.lazy
            root.lazy=0

n,m=map(int,input().split())
init=list(map(int,input().split()))
sg=SegTree(1,n,lambda x:init[x-1])
# def dfs(root):
#     if root.cl==root.cr:
#         print(root.val)
#         return
#     dfs(root.left)
#     dfs(root.right)
# dfs(sg.root)
for _ in range(m):
    op,x,y,*v=map(int,input().split())
    if op==1:
        sg.modify(x,y,v[0])
    else:
        print(sg.query(x,y))


2022/7/24 13:34
加载中...