“玲珑杯” 线上赛 Round #5 Variance(线段树)

本文介绍了一种利用线段树进行单点更新和区间方差计算的方法,并提供了完整的C++实现代码。通过线段树维护节点的和与平方和,可以高效地求得区间方差。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1063 -- Variance


线段树:1.单点更新   2.区间方差 *(r-l+1)^2

ps:方差:Var[x]=E[x^2]-E[x]^2


代码:

#include <bits/stdc++.h>
using namespace std;

#define LL long long  
const int maxn=2<<18;  

LL a[maxn];  
LL sum[maxn];
  
void pushup(int rt){  
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];  
    a[rt]=a[rt<<1]+a[rt<<1|1];  
} 
 
void build(int l,int r,int rt){  
   if(l==r){  
       scanf("%d",&sum[rt]);  
       a[rt]=sum[rt]*sum[rt];  
       return ;  
   }  
   int m=(l+r)>>1;  
   build(l,m,rt<<1);  
   build(m+1,r,rt<<1|1);  
   pushup(rt);  
}  

void update(int p,int add,int l,int r,int rt){  
    if(l==r){  
        sum[rt]=add;  
        a[rt]=add*add;  
        return ;  
    }  
    int m=(l+r)>>1;  
    if(p<=m) update(p,add,l,m,rt<<1);  
    else update(p,add,m+1,r,rt<<1|1);  
    pushup(rt);  
}
  
LL query1(int L,int R,int l,int r,int rt){  
    if(L<=l&&r<=R){  
        return sum[rt];  
    }  
    int m = (l + r) >> 1;  
    LL ret = 0;  
    if (L <= m) ret += query1(L,R,l,m,rt<<1);  
    if (R > m) ret+= query1(L,R,m+1,r,rt<<1|1);  
    return ret;  
}  

LL query2(int L,int R,int l,int r,int rt){  
    if(L<=l&&r<=R){  
        return a[rt];  
    }  
    int m = (l + r) >> 1;  
    LL ret = 0;  
    if (L <= m) ret += query2(L,R,l,m,rt<<1);  
    if (R > m) ret+= query2(L,R,m+1,r,rt<<1|1);  
    return ret;  
}  

int main(){  
    int n,m,q,l,r;  
    scanf("%d%d",&n,&m);  
    build(1,n,1);  
    while(m--){  
        scanf("%d%d%d",&q,&l,&r);  
        if(q==1){  
             update(l,r,1,n,1);  
        }else{  
             LL s=query1(l,r,1,n,1);  
             LL d=query2(l,r,1,n,1);  
             int e=r-l+1;  
             LL ans=d*e-s*s;  
             printf("%lld\n",ans);  
        }  
    }  
    return 0;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值