「Luogu 1471」 方差
题目背景
滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西。
题目描述
蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数。他想算算这个数列的平均数和方差。
输入输出格式
输入格式:
第一行包含两个正整数N、M,分别表示数列中实数的个数和操作的个数。
第二行包含N个实数,其中第i个实数表示数列的第i项。
接下来M行,每行为一条操作,格式为以下两种之一:
操作13:1 x y k ,表示将第x到第y项每项加上k,k为一实数。
操作2:2 x y ,表示求出第x到第y项这一子数列的平均数。
操作3:3 x y ,表示求出第x到第y项这一子数列的方差。
输出格式:
输出包含若干行,每行为一个实数,即依次为每一次操作2或操作3所得的结果(所有结果四舍五入保留4位小数)。
输入输出样例
输入样例: 输出样例
5 5 3.0000
1 5 4 2 3 2.0000
2 1 4 0.8000
3 1 5
1 1 1 1
1 2 2 -1
3 1 5
说明
数据范围
-------------------------------------分界线-------------------------------------
题解
这道题要求两个值,一个是平均值,一个是方差,平均值很容易,就是区间和/个数就可以了。但是怎么求方差呢?看上去十分困难,不知道如何下手,不知道怎么维护?但是不妨把方差的公式拆开:
设平均数为k
则S²=[(a1-k)²+(a2-k)²+(a3-k)²+...+(an-k)²]/n(将他拆开)
=[a1²+a2²+a3²+...+an²+nk²-2k(a1+a2+a3+...+an)]/n
∵ (a1+a2+a3+...+an)/n=k
∴ S²=(a1²+a2²+a3²+...+an²)/n-k²
所以现在显而易见要维护方差只要维护平方的和就可以了
那么怎么维护平方和呢?
在拆开一下:
设每个数加上了x
(a1+x)²+(a2+x)²+(a3+x)²+...+(an+x)²
=a1²+a2²+a3²+...+an²+nx²+2x(a1+a2+a3+...+an)
所以现在就很容易了,接下来上代码
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
struct node {
double lazy,v,sqr;
} a[400001];
double b[400001];
void pushup(int k) {
a[k].v=a[k<<1].v+a[k<<1|1].v;
a[k].sqr=a[k<<1].sqr+a[k<<1|1].sqr;
}
void add(int k,int l,int r,double v) {
a[k].lazy+=v;
a[k].sqr+=((r-l+1)*v*v+2*v*a[k].v);
a[k].v+=(r-l+1)*v;
}
void pushdown(int k,int l,int r) {
if(a[k].lazy) {
int mid=(l+r)>>1;
add(k<<1,l,mid,a[k].lazy);
add(k<<1|1,mid+1,r,a[k].lazy);
}
a[k].lazy=0;
}
void update(int k,int l,int r,int begin,int end,double c) {
if(r<begin||l>end)
return ;
if(l>=begin&&r<=end) {
add(k,l,r,c);
return;
}
pushdown(k,l,r);
int mid=(l+r)>>1;
update(k<<1,l,mid,begin,end,c);
update(k<<1|1,mid+1,r,begin,end,c);
pushup(k);
}
double find(int k,int l,int r,int begin,int end) {
if(r<begin||l>end)
return 0;
if(l>=begin&&r<=end)
return a[k].v;
pushdown(k,l,r);
int mid=(l+r)>>1;
if(end<=mid)
return find(k<<1,l,mid,begin,end);
else if(begin>mid)
return find(k<<1|1,mid+1,r,begin,end);
else
return find(k<<1,l,mid,begin,mid)+find(k<<1|1,mid+1,r,mid+1,end);
}
double find1(int k,int l,int r,int begin,int end) {
if(r<begin||l>end)
return 0;
if(l>=begin&&r<=end)
return a[k].sqr;
pushdown(k,l,r);
int mid=(l+r)>>1;
if(end<=mid)
return find1(k<<1,l,mid,begin,end);
else if(begin>mid)
return find1(k<<1|1,mid+1,r,begin,end);
else
return find1(k<<1,l,mid,begin,mid)+find1(k<<1|1,mid+1,r,mid+1,end);
}
void build(int k,int l,int r) {
a[k].lazy=0;
if(l==r) {
a[k].v=b[l];
a[k].sqr=b[l]*b[l];
return ;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pushup(k);
}
int main() {
int n,m,L,x,y;
double c;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
scanf("%lf",&b[i]);
build(1,1,n);
for(int i=1; i<=m; i++) {
scanf("%d%d%d",&L,&x,&y);
if(L==1) {
scanf("%lf",&c);
update(1,1,n,x,y,c);
}
if(L==2)
printf("%0.4lf\n",find(1,1,n,x,y)*1.0/(y-x+1));
if(L==3) {
double ans=find(1,1,n,x,y)*1.0/(y-x+1);
ans*=ans;
printf("%0.4lf\n",(find1(1,1,n,x,y)*1.0/(y-x+1))-ans);
}
}
}
「Luogu 1471」 方差的更多相关文章
- 「 Luogu P1231 」 教辅的组成
题目大意 有 $\text{N1}$ 本书 $\text{N2}$本练习册 $\text{N3}$本答案,一本书只能和一本练习册和一本答案配对.给你一些书和练习册,书和答案的可能的配对关系.问你最多可 ...
- 「Luogu 1525」关押罪犯
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description \(S\)城现有两座监狱,一共关押着\(N\)名罪犯,编号分别为\(1 - N\) ...
- 「Luogu 2367」语文成绩
更好的阅读体验 Portal Portal1: Luogu Description 语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行.她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少 ...
- 「Luogu 1821」[USACO07FEB]银牛派对Silver Cow Party
更好的阅读体验 Portal Portal1: Luogu Portal2: POJ Description One cow from each of N farms \((1 \le N \le 1 ...
- 「Luogu 1349」广义斐波那契数列
更好的阅读体验 Portal Portal1: Luogu Description 广义的斐波那契数列是指形如\(an=p \times a_{n-1}+q \times a_{n-2}\)的数列.今 ...
- 「Luogu 3792」由乃与大母神原型和偶像崇拜
更好的阅读体验 Portal Portal1: Luogu Description 给你一个序列\(a\) 每次两个操作: 修改\(x\)位置的值为\(y\): 查询区间\([l, r]\)是否可以重 ...
- 「Luogu P3866」[TJOI2009]战争游戏 解题报告
题面 好难表述啊~ 在n*m的矩阵上,有一些大兵(为0),一些空地(一个正整数),障碍物(-1),现在摧毁一些空地,使所有大兵不能走出矩阵去(代价为表示空地的整数),求最小代价 思路: 网络流最小割 ...
- 「Luogu P2201」数列编辑器 解题报告
数列编辑器,在线IDE 本期的主题是洛谷的在线IDE 小学生?!小学生虐我
- 「 Luogu P2574 」 XOR的艺术——线段树
# 解题思路 这题不难,但是原谅我一开始的傻逼想法,一会儿再给大家透露透露. 先说怎么做这题. 显然对于 $0$ 和 $1$ 来说,异或无非也就只有两种变化 异或了奇数次,$0$ 就会变成 $1$,$ ...
随机推荐
- (转)编写 DockerFile
这几天在研究怎样制作docker image. 其中使用dockerfile是一种可记录制作image的过程的并且是容易重复使用的一种方式.在园子里看到了一篇好文,于是分享到这里~~ 原文链接: ht ...
- Android的按钮单击事件及监听器的实现方式
第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式 的事件监听器更合适 ...
- Lambda中的常用sql方法
1.Groupby 对集合进行分组,如: var dllList = _menuMan.Load(c => c.TXT_ASSEMBLYNAME != null).GroupBy(c=>c ...
- Halcon学习之一:查询图像参数
版权声明:本文为博主原创文章,未经博主允许不得转载. 1.get_grayval ( Image : : Row, Column : Grayval ) 计算Image图像中坐标为(Row,Colum ...
- jQuery使用toggle()方法进行显示隐藏
转自:https://www.cnblogs.com/sosoft/p/3460556.html 这是一个示例: 1 <html> 2 <head> 3 <script ...
- 关于苹果safari浏览器登陆时Cookie无法保存的问题
前段时间,修改了登录处理后给到客户端浏览器Cookie的内容,新增了一个姓名的value,发现safari不能保存该Cookie的内容,同时Chrome.firefox.ie等浏览器都能正常的访问,直 ...
- SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架
1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ...
- Docker02 基本命令、开发环境搭建、docker安装nginx、Dockerfile、路径挂载
1 基本命令 1.1 docker相关 centos6.5 安装docker环境 >sudo yum install -y http://mirrors.yun-idc.com/epel/6/i ...
- WebFlux04 SpringBootWebFlux集成MongoDB之Windows版本、WebFlux实现CRUD、WebFlux实现JPA、参数校验
1 下载并安装MongoDB 1.1 MongoDB官网 1.2 下载 solutions -> download center 1.3 安装 双击进入安装即可 1.3.1 安装时常见bug01 ...
- 使用RVM更新Ruby 版本
http://rvm.io/rvm/install Install RVM (development version): \curl -sSL https://get.rvm.io | bash Wi ...