「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$,$ ...
随机推荐
- Jenkins详细安装教程
1.先下载msi文件 Jenkins下载链接: https://pan.baidu.com/s/1SACKNgW7OZrJoXMRDhsJxQ 提取码: 94b9 2.安装 解压后得到的是jenkin ...
- __CLASS__
<?php class base_class { function say_a() { echo "'a' - said the " . __CLASS__ . " ...
- IntelliJ IDEA中如何设置忽略@param注释中的参数与方法中的参数列表不一致的检查
- python开发函数进阶:内置函数
一,内置函数 #内置的模块#拿过来直接就用的:内置的函数 #!/usr/bin/env python #_*_coding:utf-8_*_ #内置的模块 #拿过来直接就用的:内置的函数 #作用域相关 ...
- dubbo学习 二 dubbo源码大致查阅
源码的解析在官网都已经写的非常详细,可以参考:http://dubbo.io/Developer+Guide-zh.htm 服务提供者暴露一个服务的详细过程 首先ServiceConfig类拿到对 ...
- Java面向对象作业-用接口方式测试向下转型
Java面向对象作业-用接口方式测试向下转型 根据视频的里实例 我们直接修改Test2测试方法: package com.java1234.chap03.sec13; public class Tes ...
- Minimum Sum of Array(map)
You are given an array a consisting of n integers a1, ..., an. In one operation, you can choose 2 el ...
- Spark的几个问题
1.application是由driver和executor组成的,executor可以分成task,task又可以分成为stage.当一个任务提交给spark之后,spark机群的主节点会出现dri ...
- Python文件修改和常用方法
为了更好地说明接下来的文件修改操作,我们有必要先来学习下文件操作的常用方法. 一.文件处理中的常用方法 #!/usr/bin/env python3 #-*- coding:utf-8 -*- # w ...
- CasperJs 入门介绍
CasperJs 是一个基于 PhantomJs 的工具,其比起 PhantomJs 可以更加方便的进行 navigation. 1.安装 CasperJS 依赖于 PhantomJS >= 1 ...