「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$,$ ...
随机推荐
- Windows10 官方原版镜像下载途径 Label:win10解决方案
https://www.microsoft.com/en-gb/software-download/windows10ISO 设置浏览标签为手机以避免跳转,下载即可 或者手机打开该网址,获取下载链接 ...
- pcs与crmsh命令比较
一.概念 1.crmsh This project is not part of the GNU Project. Pacemaker command line interface for manag ...
- whoosh----索引|搜索文本类库
先了解基本概念和步骤: Quick Start Whoosh是一个索引文本和搜索文本的类库,他可以为你提供搜索文本的服务,比如如果你在创建一个博客的软件,你可以用whoosh为它添加添加一个搜索功能以 ...
- 软件部需求,内容采集,显示内容图文列表,MongoDB数据导入导出JSON
全局变量 由于多个html页面,需要引用同一个变量.这个时候,需要定义一个全局变量!如何定义呢? 默认包含了mui的html文件都导入mui.js文件.那么将变量写在mui.js中,就可以实现所有页面 ...
- ubuntu主目录下的中文文件夹名改回英文
linux下经常用命令行,目录有中文输起来非常麻烦,想把他改回英文于是登录的时候选择英文发现没装英文语言环境,为这个重新装麻烦,只能再想办法 找了一下发现传话里有个用户文件夹更新,命令是xdg-use ...
- LCD 调试总结
转自:http://blog.csdn.net/qikaibinglan/article/details/5630246 (1) 液晶显示模式 并行:MCU接口.RGB接口.Vysnc接口 串行:SP ...
- Linux下查看进程的命令输出的内容解释
Linux下查看进程的命令输出的内容解释 ps (process status) ps -e 或者ps -A (-e和-A完全一样) PID TTY TIME ...
- 简单的so修改
今天有点小高兴哈,终于能修改so了 虽然只是hello,word..改成了.come,on,men.. 但是感觉也不错了. 只用两个工具. 1.盗版的ida定位可疑代码地址. 2.盗版的ultralE ...
- 正确理解Python函数是第一类对象
正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数 ...
- java用JDBC连接数据库的方式
//驱动位置String sDBDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";//连接数据库地址名字String ...