蒟蒻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. How To Call Stored Procedure In Hibernate

    How To Call Stored Procedure In Hibernate In this tutorial, you will learn how to call a store proce ...

  2. long([x[, base]]) :将一个字符转换为long类型

    python的int型最大值和系统有关,32位和64位系统看到的结果是不一样,分别为2的31次方减1和2的63次方减1,可以通过sys.maxint查看此值. >>> import ...

  3. Java中的数组问题

    java.util.Arrays  This class deals with 'real' arrays in java, in the form of T[]. Thus it doesn't d ...

  4. HDU 4540 威威猫系列故事——打地鼠(DP)

    点我看题目 题意 :中文题,不详述. 思路 : 状态转移方程 dp[ i ][ j ] = dp[i-1][k] + fabs(a[ i ][ j ]-a[i-1][k]) ; dp[i][j]代表的 ...

  5. SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-005-以path parameters的形式给action传参数(value=“{}”、@PathVariable)

    一 1.以path parameters的形式给action传参数 @Test public void testSpittle() throws Exception { Spittle expecte ...

  6. get started with laravel

    Browsing the API (http://laravel.com/api) can be somewhat intimidating at first.But it is often the ...

  7. Yii CDbCriteria

    Yii的Active Recorder包装了很多. 特别是把SQL中 把where,order,limit,IN/not IN,like等常用短句都包含进CDbCriteria这个类中去,这样整个代码 ...

  8. 【HDOJ】1238 Substrings

    深搜+剪枝,简单字符串. #include <stdio.h> #include <string.h> #define MAXLEN 105 #define MAXNUM 10 ...

  9. open MMT.distributions = null on transaction type: WIP Lot Split

    open MMT.distributions = null on transaction type:  WIP Lot Split       打开物料事务处理界面,发现事务处理类型为:WIP Lot ...

  10. 细说SQL性能优化

    1:在进行多表关联时,多用where语句把单个表的结果集最小化,多用聚合函数汇总结果集后再与其它表做关联,以使结果集数据量最小化2:在两张表进行关联时,应考虑可否使用右连接.以提高查询速度3:使用wh ...