洛谷——P1471 方差
P1471 方差
题目描述
蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数。他想算算这个数列的平均数和方差。
借一下远航之曲大佬的图片,特别清晰:

那么只要维护区间平方和,就可以求方差了。

区间平方和,恩,push_down稍微改一下即可。
注意精度问题。
#include<bits/stdc++.h> #define N int(1e6)
#define LL long long using namespace std; void in(LL &x) {
register char c=getchar();
x=;
int f=;
while(!isdigit(c)) {
if(c=='-') f=-;
c=getchar();
}
while(isdigit(c)) {
x=x*+c-'';
c=getchar();
}
x*=f;
} struct node{
LL l,r;
double w1,w2,mul,ad;
}tr[N]; inline void push_up(int k){
tr[k].w1=tr[k<<].w1+tr[k<<|].w1;
tr[k].w2=tr[k<<].w2+tr[k<<|].w2;
} inline void build(LL k,LL l,LL r){
tr[k].l=l,tr[k].r=r;
if(l==r) {
scanf("%lf",&tr[k].w1);
tr[k].w2=tr[k].w1*tr[k].w1;
return;
}
LL mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
push_up(k);
} inline void push_down(LL k){
if(tr[k].ad){
tr[k<<].w2+=tr[k<<].w1**tr[k].ad+(tr[k<<].r-tr[k<<].l+)*tr[k].ad*tr[k].ad;
tr[k<<].w1+=tr[k].ad*(tr[k<<].r-tr[k<<].l+);
tr[k<<].ad+=tr[k].ad;
tr[k<<|].w2+=tr[k<<|].w1**tr[k].ad+(tr[k<<|].r-tr[k<<|].l+)*tr[k].ad*tr[k].ad;
tr[k<<|].w1+=tr[k].ad*(tr[k<<|].r-tr[k<<|].l+);
tr[k<<|].ad+=tr[k].ad;
tr[k].ad=;
}
} inline void update(LL k,LL L,LL R,double w){
int l=tr[k].l,r=tr[k].r,mid=(l+r)>>;
if(l>=L&&r<=R){
tr[k].w2+=tr[k].w1**w+(r-l+)*w*w;
tr[k].w1+=w*(r-l+);
tr[k].ad+=w;
return;
}
push_down(k);
if(L<=mid) update(k<<,L,R,w);
if(R>mid) update(k<<|,L,R,w);
push_up(k);
} double query1(LL k,LL L,LL R){
int l=tr[k].l,r=tr[k].r,mid=(l+r)>>;
if(l>=L&&r<=R) return tr[k].w1;
push_down(k);
double an=;
if(L<=mid) an+=query1(k<<,L,R);
if(R>mid) an+=query1(k<<|,L,R);
push_up(k);
return an;
} double query2(LL k,LL L,LL R){
int l=tr[k].l,r=tr[k].r,mid=(l+r)>>;
if(l>=L&&r<=R) return tr[k].w2;
push_down(k);
double an=;
if(L<=mid) an+=query2(k<<,L,R);
if(R>mid) an+=query2(k<<|,L,R);
push_up(k);
return an;
} LL n,m; int main()
{
in(n),in(m);
build(,,n);
for(LL opt,l,r,i=;i<=m;i++){
in(opt),in(l),in(r);
if(opt==){
double w;
scanf("%lf",&w);
update(,l,r,w);
}
if(opt==){
printf("%.4lf\n",(double)query1(,l,r)/(r-l+));
}
if(opt==){
double an=(double)query2(,l,r)/(r-l+)-(double)query1(,l,r)/(r-l+)*(double)query1(,l,r)/(r-l+);
printf("%.4lf\n",an);
}
}
return ;
}
洛谷——P1471 方差的更多相关文章
- 洛谷 P1471 方差
洛谷 P1471 方差 题目背景 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的 ...
- 洛谷P1471 方差
蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. ——by 洛谷; http://www.luogu.org/problem/show?pid=1 ...
- 2018.08.16 洛谷P1471 方差(线段树)
传送门 线段树基本操作. 把那个方差的式子拆开可以发现只用维护一个区间平方和和区间和就可以完成所有操作. 同样区间修改也可以简单的操作. 代码: #include<bits/stdc++.h&g ...
- 【洛谷P1471】方差
题目大意:维护一个有 N 个元素的序列,支持以下操作:区间加,区间询问均值,区间询问方差. 题解:可知区间均值和区间和有关,即:维护区间和就等于维护了区间均值.区间方差表达式为 \(\frac{\Si ...
- AC日记——方差 洛谷 P1471
方差 思路: 线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct TreeN ...
- 【洛谷】【线段树】P1471 方差
[题目背景:] 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. [题目描述:] 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差 ...
- 洛谷P4072 [SDOI2016]征途(带权二分,斜率优化)
洛谷题目传送门 一开始肯定要把题目要求的式子给写出来 我们知道方差的公式\(s^2=\frac{\sum\limits_{i=1}^{m}(x_i-\overline x)^2}{m}\) 题目要乘\ ...
- 洛谷NOIp热身赛题解
洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...
- 洛谷 P4072 [SDOI2016]征途 斜率优化DP
洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...
随机推荐
- build.gradle解析
1 providedCompile.testImplementation.implementation.api.runtime.testCompile.classpath.natives 这些都是和p ...
- POJ2069 最小球覆盖 几何法和退火法
对这种问题不熟悉的读者 可以先去看一看最小圆覆盖的问题 ZOJ1450 现在我们来看最小球覆盖问题POJ2069 题目很裸,给30个点 求能覆盖所有点的最小球的半径. 先给出以下几个事实: 1.对于一 ...
- Java多线程系列五——列表类
参考资料: http://xxgblog.com/2016/04/02/traverse-list-thread-safe/ 一些列表类及其特性 类 线程安全 Iterator 特性 说明 Vect ...
- bzoj 3156: 防御准备【斜率优化dp】
就是套路咯,设s[i]为1+2+...i 首先列出dp方程\( f[i]=min(f[j]+a[i]+(i-j)*i-(s[i]-s[j])) \) 然后推一推 \[ f[i]=f[j]+a[i]+( ...
- 第四代增强 源代码增强(ABAP Source Code Enhancements)
显式代码增强的创建 se38打开你要增强的程序 进入编辑状态 在菜单栏选择: Edit->Enhancement Opreations->Create option. 此时弹出Create ...
- knockout jquery警告删除
//触发删除的动作 $("a.delete").live('click', function () { var ...
- 乐搏讲自动化测试- Python环境搭建(7)
Python的下载和安装 Python可应用于多平台包括 Linux 和 Mac OS X.你可以通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Py ...
- Linux学习笔记之Linux常用命令剖析-cat/chmod/cd
1.cat:用于连接文件并打印到标准输出设备上.(使用权限:所有使用者) 语法格式:cat [-AbeEnstTuv] [--help] [--version] fileName 参数说明: -n 或 ...
- 【SPOJ-GCDEX】GCD Extreme(欧拉函数)
题目: SPOJ-GCDEX (洛谷 Remote Judge) 分析: 求: \[\sum_{i=1}^{n}\sum_{j=i+1}^{n}gcd(i,j)\] 这道题给同届新生讲过,由于种种原因 ...
- SparkContext, map, flatMap, zip以及例程wordcount
SparkContext 通常作为入口函数,可以创建并返回一个RDD. 如把Spark集群当作服务端那Spark Driver就是客户端,SparkContext则是客户端的核心: 如注释所说 Spa ...