「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$,$ ...
随机推荐
- 杂项-公司-百科:华特·迪士尼-un
ylbtech-杂项-公司-百科:华特·迪士尼 华特·迪士尼(Walt Disney,全名Walter Elias Disney,又译沃尔特·迪士尼,1901年12月5日—1966年12月15日),出 ...
- 1139 First Contact
题意:给出n个人,m对朋友关系,其中带负号的表示女孩.然后给出k对查询a,b,要求找出所有a的同性别好友c,以及b的同性别好友d,且c和d又是好友关系.输出所有满足条件的c和d,按c的升序输出,若c编 ...
- 第10章 深入理解Session与Cookie
需要很多Cookie时,考虑HTTP对Cookie数量和大小的限制. 几百或更多台服务器的时候,如何解决Session在多态服务器之间共享的问题. 还有一些安全问题,如Cookie被盗,Cookie伪 ...
- win7重新安装后删除文件权限不够(小技巧)
选择文件,安全,编辑,如果用户权限可以编辑,那么赋予提示的用户权限. 如果此时用户不可编辑,那先把所属用户换了,安全,高级,所有者,更换所有者之后,权限就可以编辑了.
- Centos7 超简单将Centos的yum源更换为国内的阿里云源
1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base ...
- Centos安装php高版本
安装 1.检查当前是否有安装php rpm -qa|grep php 如果有安装PHP,那么请先删除这些安装包: yum remove php* 2.安装php源 Centos 5 安装php源: ...
- Oracle11gr2_ADG管理之跳归档恢复dg实战
模拟故障 关闭备库 SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut dow ...
- js判断页面加载完毕方法
判断页面加载完成这个方法是很常见的,下面有三个常用的方法,各有利弊. 一.纯js方法 // (1).页面所有内容加载完成执行 window.onload = function(){ } // (2). ...
- wireshark怎么抓包、wireshark抓包详细图文教程(转)
wireshark怎么抓包.wireshark抓包详细图文教程 wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示网络封包的详细信息.使用wireshark的人必 ...
- Vulkan Tutorial 04 理解Validation layers
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 What are validation layers? Vulkan API的设计核 ...