题目传送门

开了十倍空间才过是什么鬼?该不会我线段树炸了吧……
细思极恐


平均数都会求,维护区间和,到时候除一下就好了。

方差的求法如下
(用的Luogu的图片)
因为要维护一个平方,我们可以考虑使用van♂完全平方公式将它拆开,这样只用线段树维护区间和和区间平方和就可以了。
对于区间修改,同样使用完全平方公式。

要注意的一点是,修改时,要先修改平方和,再修改和,因为我们修改平方和时要用到区间和。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define ls p<<1
#define rs p<<1|1
#define mid ((l+r)>>1)
using namespace std;
struct zzz{
    double sum,pf;
}tree[1000010<<2];
double tag[1000010<<2],a[1000010];
inline void up(int p){
    tree[p].sum=tree[ls].sum+tree[rs].sum;
    tree[p].pf=tree[ls].pf+tree[rs].pf;
}
void build(int l,int r,int p){
    if(l==r){
        tree[p].sum=a[l];
        tree[p].pf=a[l]*a[l];
        return ;
    }
    build(l,mid,ls); build(mid+1,r,rs);
    up(p);
}
inline void down(int l,int r,int p){
//用完全平方公式修改平方和
    tree[ls].pf+=2*tree[ls].sum*tag[p]+tag[p]*tag[p]*(mid-l+1);
    tree[rs].pf+=2*tree[rs].sum*tag[p]+tag[p]*tag[p]*(r-mid);
//维护区间和
    tree[ls].sum+=tag[p]*(mid-l+1);
    tree[rs].sum+=tag[p]*(r-mid);
    tag[ls]+=tag[p]; tag[rs]+=tag[p]; tag[p]=0;
}
void update(int l,int r,int p,int nl,int nr,double k){
    if(l>=nl&&r<=nr){
        tree[p].pf+=2*tree[p].sum*k+k*k*(r-l+1);
        tree[p].sum+=k*(r-l+1);
        tag[p]+=k;
        return ;
    }
    down(l,r,p);
    if(nl<=mid) update(l,mid,ls,nl,nr,k);
    if(nr>mid) update(mid+1,r,rs,nl,nr,k);
    up(p);
}
double query(int l,int r,int p,int nl,int nr){
    double ans=0;
    down(l,r,p);
    if(l>=nl&&r<=nr) return tree[p].sum;
    if(nl<=mid) ans+=query(l,mid,ls,nl,nr);
    if(nr>mid) ans+=query(mid+1,r,rs,nl,nr);
    return ans;
}
double query2(int l,int r,int p,int nl,int nr){
    double ans=0;
    down(l,r,p);
    if(l>=nl&&r<=nr) return tree[p].pf;
    if(nl<=mid) ans+=query2(l,mid,ls,nl,nr);
    if(nr>mid) ans+=query2(mid+1,r,rs,nl,nr);
    return ans;
}
int read(){
    int k=0,f=1; char c=getchar();
    for(;c<'0'||c>'9';c=getchar())
      if(c=='-') f=-1;
    for(;c>='0'&&c<='9';c=getchar())
      k=k*10+c-48;
    return k*f;
}
int main(){
    int n=read(),m=read();
    for(int i=1;i<=n;i++) scanf("%lf",&a[i]);
    build(1,n,1);
    for(int i=1;i<=m;i++){
        int opt=read(),l=read(),r=read();
        if(opt==1){
            double k; scanf("%lf",&k);
            update(1,n,1,l,r,k);
        }
        if(opt==2){
            printf("%.4lf\n",query(1,n,1,l,r)/(r-l+1));
        }
        if(opt==3){
            double sum=query(1,n,1,l,r);
            double pj=sum/(r-l+1);
            double pf=query2(1,n,1,l,r);
            printf("%.4lf\n",(pf-2*sum*pj+pj*pj*(r-l+1))/(r-l+1));
        }
    }
    return 0;
}

Luogu P1471 方差的更多相关文章

  1. 【题解】Luogu P1471 方差

    原题传送门 简单进行推导之后,就能发现很妙的结论 用线段树维护区间和,区间平方和就珂以算出结果 #include <bits/stdc++.h> #define db double #de ...

  2. Luogu P1471 方差 线段树

    那是上上周...也是重构了四遍...后来GG了...今天又拾起,搞了搞终于过了... 好吧就是个线段树,公式懒得推了https://www.cnblogs.com/Jackpei/p/10693561 ...

  3. 洛谷 P1471 方差

    洛谷 P1471 方差 题目背景 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的 ...

  4. 【洛谷】【线段树】P1471 方差

    [题目背景:] 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. [题目描述:] 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差 ...

  5. 洛谷——P1471 方差

    P1471 方差 题目描述 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. 借一下远航之曲大佬的图片,特别清晰: 那么只要维护区间平方和,就可以 ...

  6. 【luogu P1471】方差

    https://www.luogu.org/problem/show?pid=1471 一眼就能看出是线段树/树状数组题目了. 求平均不用说,线段树/树状数组维护区间和即可. 方差怎么求?先变换下方差 ...

  7. 洛谷P1471 方差

    蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. ——by 洛谷; http://www.luogu.org/problem/show?pid=1 ...

  8. P1471 方差

    题目 luogu 思路 \[\frac{1}{n}*\sum_{1}^{n}( a_{i}-A)^{2}\] \[\frac{1}{n}*\sum_{1}^{n}( a_{i}^2-2*A*a_{i} ...

  9. 2018.08.16 洛谷P1471 方差(线段树)

    传送门 线段树基本操作. 把那个方差的式子拆开可以发现只用维护一个区间平方和和区间和就可以完成所有操作. 同样区间修改也可以简单的操作. 代码: #include<bits/stdc++.h&g ...

随机推荐

  1. Spring【基础】-注解-转载

    站在巨人的肩膀上,感谢! https://blog.csdn.net/chjttony/ 1.在java开发领域,Spring相对于EJB来说是一种轻量级的,非侵入性的Java开发框架, 曾经有两本很 ...

  2. 批处理打开和关闭oracle11g 服务

    也许我们经常会有这样一些困惑,如果让oracle随开机启动,我们得电脑内存会被占用殆尽,运行速度会变的异常慢,但是,手动一个一个去启动和关闭,又会非常麻烦.为了解决这个问题,我们有一个办法,那就是写两 ...

  3. [BJWC2008]雷涛的小猫 dp

    题目背景 原最大整数参见P1012 题目描述 雷涛同学非常的有爱心,在他的宿舍里,养着一只因为受伤被救助的小猫(当然,这样的行为是违反学生宿舍管理条例的).在他的照顾下,小猫很快恢复了健康,并且愈发的 ...

  4. 洛谷P4113 [HEOI2012]采花

    题目描述 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花. 花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于 ...

  5. Qt学习之网络编程(二)

    UDP协议 UDP协议(用户数据报协议)是一种简单轻量级.不可靠.面向数据报.无连接的传输层协议.之后我们会介绍TCP协议,相对于UDP,TCP是一种可靠的.有连接的协议:既然这样我们就用TCP不就好 ...

  6. Swing实现canvas-nest.js 源码

    #### 说明 canvas-nest.js 源码 http://www.bubuko.com/infodetail-2237716.html 地址:https://gitee.com/dgwcode ...

  7. abp架构中加载公共css样式表和公共js的文件目录位置

    src\shared\helpers\LocalizedResourcesHelper.ts

  8. 004 Median of Two Sorted Arrays 两个有序数组的中位数

    There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the two ...

  9. Vertical roller mill from SBM

    Vertical roller mill has many different forms, but it works basically the same. All of these forms o ...

  10. Echarts同一页面多个图表自适应浏览器窗口大小——window.onresize

    当前做的一个项目中,频繁使用到百度团队的Echarts,发在一个页面同时出现多个图表时,只有最后一个图表触发了window.onresize事件,查询官方文档后得到解决. 方法如下: hwChart. ...