蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数。他想算算这个数列的平均数和方差。

——by 洛谷;

http://www.luogu.org/problem/show?pid=1471



平均数可以用线段树,维护区间和,直接维护平均数也行;

然后对于方差;她有个公式的:

S=[(a-Z)²+(b-Z)²+(c-Z)²+(d-Z)²+(e-Z)²...]/n(Z为平均数)

S=[区间平方和-2*n*平均数²+n*平均数²]/n;

S=[区间平方和-n*平均数²]/n;

所以维护个平方和就好了;

然后,平方和怎么区间加呢?

她也有个公式:

(a+z)²+(b+z)²+(c+z)²+(d+z)²+(e+z)²(你把她拆开嘛。。)

=以前平方和+(2z*(Z*n)+n*z²);

然后是代码解释,

我只打了一个Lazy,意为在该区间的子树上要区间加,然后两个线段树共用;

因为平方和修改要用区间平均数未修改的值,故两树同步修改,先改平方和;

代码如下:

 #include<cstdio>
#include<iostream>
using namespace std;
double treen[];
double treen1[];
double lz[];
int n,m,R,L;
double a; void build(int ,int ,int );
void add(int ,int ,int );
double sum( int ,int ,int );
double sum1(int ,int ,int );
void down(int ,int ,int ); int main()
{
int i,j,b;
double ans,k;
scanf("%d%d",&n,&m);
build(,n,);
for(i=;i<=m;i++)
{
scanf("%d",&b);
if(b==)
{
scanf("%d%d",&L,&R);
cin>>a;
add(,n,);
}
if(b==)
{
scanf("%d%d",&L,&R);
ans=sum(,n,)/(R-L+);
printf("%.4lf\n",ans);
}
if(b==)
{
scanf("%d%d",&L,&R);
ans=sum(,n,)/(R-L+);
ans=ans*ans;
k=sum1(,n,);
ans=k/(R-L+)-ans;
printf("%.4lf\n",ans);
}
}
} void build(int l,int r,int nu)
{
if(l==r)
{
scanf("%lf",&treen[nu]);
treen1[nu]=treen[nu]*treen[nu];
return ;
}
int mid=(l+r)>>;
build(l,mid,nu<<);
build(mid+,r,(nu<<)+);
treen[nu]=(treen[nu<<]*(mid-l+)+treen[(nu<<)+]*(r-mid))/(r-l+1.0);
treen1[nu]=treen1[nu<<]+treen1[(nu<<)+];
} void add(int l,int r,int nu)
{
if(L<=l&&r<=R)
{
lz[nu]+=a;
treen1[nu]+=(r-l+)*(a**treen[nu]+a*a);
treen[nu]+=a;
return ;
}
int mid=(l+r)>>;
down(l,r,nu);
if(L<=mid)
add(l,mid,nu<<);
if(R>=mid+)
add(mid+,r,(nu<<)+);
treen[nu]=(treen[nu<<]*(mid-l+)+treen[(nu<<)+]*(r-mid))/(r-l+1.0);
treen1[nu]=treen1[nu<<]+treen1[(nu<<)+];
} double sum(int l,int r,int nu)
{
double su=;
if(L<=l&&r<=R)
{
return treen[nu]*(r-l+);
}
int mid=(l+r)>>;
down(l,r,nu);
if(L<=mid)
su+=sum(l,mid,nu<<);
if(R>=mid+)
su+=sum(mid+,r,(nu<<)+);
return su;
} double sum1(int l,int r,int nu)
{
double su=;
if(L<=l&&r<=R)
{
return treen1[nu];
}
int mid=(l+r)>>;
down(l,r,nu);
if(L<=mid)
su+=sum1(l,mid,nu<<);
if(R>=mid+)
su+=sum1(mid+,r,(nu<<)+);
return su;
} void down(int l,int r,int nu)
{
int mid=(l+r)>>;
lz[nu<<]+=lz[nu];
lz[(nu<<)+]+=lz[nu];
treen1[nu<<]+=(mid-l+)*(*treen[nu<<]*lz[nu]+lz[nu]*lz[nu]);
treen1[(nu<<)+]+=(r-mid)*(*treen[(nu<<)+]*lz[nu]+lz[nu]*lz[nu]);
treen[nu<<]+=lz[nu];
treen[(nu<<)+]+=lz[nu];
lz[nu]=;
}
//5 5
//1 1 1 1 1
//1 2 2 -1
//3 1 5

祝AC哟;

洛谷P1471 方差的更多相关文章

  1. 洛谷 P1471 方差

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

  2. 洛谷——P1471 方差

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

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

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

  4. 【洛谷P1471】方差

    题目大意:维护一个有 N 个元素的序列,支持以下操作:区间加,区间询问均值,区间询问方差. 题解:可知区间均值和区间和有关,即:维护区间和就等于维护了区间均值.区间方差表达式为 \(\frac{\Si ...

  5. AC日记——方差 洛谷 P1471

    方差 思路: 线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct TreeN ...

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

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

  7. 洛谷P4072 [SDOI2016]征途(带权二分,斜率优化)

    洛谷题目传送门 一开始肯定要把题目要求的式子给写出来 我们知道方差的公式\(s^2=\frac{\sum\limits_{i=1}^{m}(x_i-\overline x)^2}{m}\) 题目要乘\ ...

  8. 洛谷NOIp热身赛题解

    洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...

  9. 洛谷 P4072 [SDOI2016]征途 斜率优化DP

    洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...

随机推荐

  1. PHP漏洞全解(三)-客户端脚本植入

    本文主要介绍针对PHP网站的客户端脚本植入攻击方式.所谓客户端脚本植入攻击,是指将可以执行的脚本插入到表单.图片.动画或超链接文字等对象内.当用户打开这些对象后,黑客所植入的脚本就会被执行,进而开始攻 ...

  2. 1920-Jangbi的Rush

    描述 最后一届的OSL决赛由神族的Jangbi对阵人族Fantasy.Jangbi5BG爆叉叉准备一波rush,但是范特西早有防备,在地图上埋下了许多地雷.但是Jangbi显然不是毕姥爷那样的无脑平A ...

  3. 图片url中包含中文导致网络请求404

    需要对其中的中文使用转换格式,注意不是整个url,如果是整个,"/"这个网络分隔符`也会被转换的 URLEncoder.encode("福利", "u ...

  4. 微信JSSDK与录音相关的坑

    欢迎各位转载, 以让微信团队重视这些恼人的BUG. 请注明出处微信JSSDK与录音相关的坑 by lzl124631x 最近一直在做微信JSSDK与录音相关的功能开发, 遇到了各种奇尺大坑, 时不时冷 ...

  5. IPAddress

    Console.WriteLine("BitConverter.IsLittleEndian = {0}", BitConverter.IsLittleEndian); Conso ...

  6. Java金字塔及变形

    Java金字塔 package com.tfj.test; public class JinZiTa { public static void main(String[] args){ int num ...

  7. java集合类——Stack类

    查看java的API文档,Stack继承Vector类. 栈的特点是后进先出. API中Stack自身的方法不多,基本跟栈的特点有关. import java.util.Stack; public c ...

  8. POJ 2002 Squares 解题报告(哈希 开放寻址 & 链式)

    经典好题. 题意是要我们找出所有的正方形.1000点,只有枚举咯. 如图,如果我们知道了正方形A,B的坐标,便可以推测出C,D两点的坐标.反之,遍历所有点作为A,B点,看C,D点是否存在.存在的话正方 ...

  9. ☀【插件】iScroll

    iScroll 4.2.5 中文API √http://www.gafish.net/api/iScroll.html -webkit-overflow-scrolling: touch <!D ...

  10. zookeeper使用和原理探究(一)(转)

    zookeeper介绍zookeeper是一个为分布式应用提供一致性服务的软件,它是开源的Hadoop项目中的一个子项目,并且根据google发表的<The Chubby lock servic ...