Python是不是一定会超时。。。
查看原帖
Python是不是一定会超时。。。
116293
SammyChu楼主2021/10/17 21:26
N=100001
[n,m]=list(map(int,input().split()))
num=list(map(int,input().split()))
class SegTree():
    def __init__(self):
        self.lc=0
        self.rc=0
        self.sum=0
        self.tag=0
tr=[SegTree() for i in range(N*4)]
def build(p,l,r):
    if(l==r):
        tr[p].sum=num[l-1]
        return
    mid=(l+r)>>1
    build(p<<1,l,mid)
    build(p<<1|1,mid+1,r)
    tr[p].sum=tr[p<<1].sum+tr[p<<1|1].sum
    return
def down(p,s):
    tr[p<<1].sum+=tr[p].tag*(s-(s>>1))
    tr[p<<1].tag+=tr[p].tag
    tr[p<<1|1].sum+=tr[p].tag*(s>>1)
    tr[p<<1|1].tag+=tr[p].tag
    tr[p].tag=0
    return
def modify(x,y,z,p,l,r):
    if(x<=l)&(r<=y):
        tr[p].sum+=z*(r-l+1)
        tr[p].tag+=z
        return
    if(tr[p].tag!=0):
        down(p,r-l+1)
    mid=(l+r)>>1
    if(x<=mid):
        modify(x,y,z,p<<1,l,mid)
    if(y>mid):
        modify(x,y,z,p<<1|1,mid+1,r)
    tr[p].sum=tr[p<<1].sum+tr[p<<1|1].sum
    return
def query(x,y,p,l,r):
    if(x<=l)&(r<=y):
        return tr[p].sum
    if(tr[p].tag!=0):
        down(p,r-l+1)
    mid=(l+r)>>1
    res=0
    if(x<=mid):
        res+=query(x,y,p<<1,l,mid)
    if(y>mid):
        res+=query(x,y,p<<1|1,mid+1,r)
    return res
build(1,1,n)
while(m>0):
    m-=1
    op=list(map(int,input().split()))
    if(op[0]==1):
        modify(op[1],op[2],op[3],1,1,n)
    else:
        print(query(op[1],op[2],1,1,n))

(不要在意我为什么会用Python到洛谷来做题[doge])

2021/10/17 21:26
加载中...