线段树 方差1471

 

import sys
sys.setrecursionlimit(100000000)
n,m=map(eval,input().split())
tree1=[0 for i in range(((n)<<2)+100)]#区间和
tree2=[0 for i in range((n<<2)+100)]#区间方的和
tag=[0 for i in range((n<<2)+100)]
num=[0]+list(map(eval,input().split()))

def pushup(x):
    tree1[x]=tree1[x<<1]+tree1[x<<1|1]
    tree2[x]=tree2[x<<1|1]+tree2[x<<1]
    return

def build(x,l,r):
    if (l==r):
        tree1[x]=num[l]
        tree2[x]=num[l]*num[l]
        return
    mid=(l+r)>>1
    build(x<<1,l,mid)
    build(x<<1|1,mid+1,r)
    pushup(x)

build(1,1,n)

def pushdown(x,l,r):
    mid=(l+r)>>1
    tree2[x<<1]+=tree1[x<<1]*tag[x]*2+(mid-l+1)*tag[x]*tag[x]
    tree2[x << 1|1] += tree1[x << 1|1] * tag[x] * 2 + (r-mid) * tag[x] * tag[x]
    tree1[x<<1]+=(mid-l+1)*tag[x]
    tree1[x<<1|1]+=(r-mid)*tag[x]
    tag[x<<1]+=tag[x]
    tag[x<<1|1]+=tag[x]
    tag[x]=0
    return


def update(x,l,r,a,b,k):
    if (tag[x]!=0 and l!=r):
        pushdown(x,l,r)
    if (a<=l and r<=b):
        tree2[x] +=tree1[x]*k*2+(r-l+1)*k*k
        tree1[x]+=(r-l+1)*k
        if (l!=r):tag[x]+=k
        return
    mid=(l+r)>>1
    if (a<=mid):
        update(x<<1,l,mid,a,b,k)
    if (b>mid):
        update(x<<1|1,mid+1,r,a,b,k)
    pushup(x)


def query(x,l,r,a,b):
    sum=0
    if (tag[x]!=0 and l!=r):
        pushdown(x,l,r)
    if (a<=l and r<=b):
        return tree1[x]
    mid = (l + r) >> 1
    if (a <= mid):
        sum+=query(x << 1, l, mid, a, b)
    if (b > mid):
        sum+=query(x << 1 | 1, mid + 1, r, a, b)
    return sum

def query1(x,l,r,a,b):
    sum=0
    if (tag[x]!=0 and l!=r):
        pushdown(x,l,r)
    if (a<=l and r<=b):
        return tree2[x]
    mid = (l + r) >> 1
    if (a <= mid):
        sum+=query1(x << 1, l, mid, a, b)
    if (b > mid):
        sum+=query1(x << 1 | 1, mid + 1, r, a, b)
    return sum
for i in range(m):
    mid=list(eval(int,input().split()))
    if (mid[0]==1):
        update(1,1,n,mid[1],mid[2],mid[3])
    if (mid[0]==2):

        print("{:.4f}".format(query(1, 1, n, mid[1], mid[2]) / (mid[2] - mid[1] + 1)))
    if (mid[0]==3):
        mm=query(1, 1, n, mid[1], mid[2]) / (mid[2] - mid[1] + 1)
        m1=query1(1,1,n,mid[1],mid[2])/(mid[2] - mid[1] + 1)-mm*mm
        print("{:.4f}".format(m1))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值