【luogu P1471】方差
https://www.luogu.org/problem/show?pid=1471
一眼就能看出是线段树/树状数组题目了。
求平均不用说,线段树/树状数组维护区间和即可。
方差怎么求?先变换下方差公式:

可以看到区间的方差可以由区间内每个数的和与每个数的平方的和得来,用一棵线段树维护这两个东西就好了,好像写不了标记永久化。
当然写两棵普通的线段树/树状数组分别维护这两个东西或者分块暴力也可以不过我写挂了。
区间加的时候如何维护平方的和:

注意这里的
是指没有加之前的和。
#include <algorithm>
#include <iostream>
#define maxn 100005
using namespace std;
namespace seg
{
struct node
{
int ln, rn, mn;
long double sum[], mark;
} seg[maxn * ];
void push_down(int p)
{
if (seg[p].mark && seg[p].ln != seg[p].rn)
{
seg[p * ].mark += seg[p].mark;
seg[p * ].sum[] += * seg[p].mark * seg[p * ].sum[] + (seg[p * ].rn - seg[p * ].ln + ) * seg[p].mark * seg[p].mark;
seg[p * ].sum[] += (seg[p * ].rn - seg[p * ].ln + ) * seg[p].mark; seg[p * + ].mark += seg[p].mark;
seg[p * + ].sum[] += * seg[p].mark * seg[p * + ].sum[] + (seg[p * + ].rn - seg[p * + ].ln + ) * seg[p].mark * seg[p].mark;
seg[p * + ].sum[] += (seg[p * + ].rn - seg[p * + ].ln + ) * seg[p].mark; seg[p].mark = ;
}
}
void init(int l, int r, int p)
{
seg[p].ln = l;
seg[p].rn = r;
seg[p].mn = (l + r) / ;
seg[p].mark = ;
if (l != r)
{
init(l, seg[p].mn, p * );
init(seg[p].mn + , r, p * + );
seg[p].sum[] = seg[p * ].sum[] + seg[p * + ].sum[];
seg[p].sum[] = seg[p * ].sum[] + seg[p * + ].sum[];
}
else
{
cin >> seg[p].sum[];
seg[p].sum[] = seg[p].sum[] * seg[p].sum[];
}
}
void increase(int l, int r, long double val, int p)
{
if (seg[p].ln == l && seg[p].rn == r)
{
seg[p].mark += val;
seg[p].sum[] += * val * seg[p].sum[] + (r - l + ) * val * val;
seg[p].sum[] += (r - l + ) * val;
}
else
{
push_down(p);
if (l <= seg[p].mn)
increase(l, min(r, seg[p].mn), val, p * );
if (seg[p].mn + <= r)
increase(max(l, seg[p].mn + ), r, val, p * + );
seg[p].sum[] = seg[p * ].sum[] + seg[p * + ].sum[];
seg[p].sum[] = seg[p * ].sum[] + seg[p * + ].sum[];
}
}
long double sum(int l, int r, int p, int emm)
{
if (seg[p].ln == l && seg[p].rn == r)
{
return seg[p].sum[emm];
}
else
{
push_down(p);
long double ans = ;
if (l <= seg[p].mn)
ans += sum(l, min(r, seg[p].mn), p * , emm);
if (seg[p].mn + <= r)
ans += sum(max(l, seg[p].mn + ), r, p * + , emm);
return ans;
}
}
}
int n, m;
int main()
{
ios::sync_with_stdio(false);
cout.precision(); // 控制精度用
cin >> n >> m;
seg::init(, n, ); int opt, l, r;
long double k;
long double aver, aver2;
long double sum, sum2;
while (m--)
{
cin >> opt >> l >> r; if (opt == )
{
cin >> k;
seg::increase(l, r, k, );
}
else
{
sum = seg::sum(l, r, , );
sum2 = seg::sum(l, r, , );
aver = sum / (long double)(r - l + );
aver2 = sum2 / (long double)(r - l + ); if (opt == )
cout << fixed << aver << endl;
else
cout << fixed << aver2 - aver * aver << endl;
}
}
return ;
}
【luogu P1471】方差的更多相关文章
- Luogu P1471 方差
题目传送门 开了十倍空间才过是什么鬼?该不会我线段树炸了吧-- 细思极恐 平均数都会求,维护区间和,到时候除一下就好了. 方差的求法如下 (用的Luogu的图片) 因为要维护一个平方,我们可以考虑使用 ...
- 【题解】Luogu P1471 方差
原题传送门 简单进行推导之后,就能发现很妙的结论 用线段树维护区间和,区间平方和就珂以算出结果 #include <bits/stdc++.h> #define db double #de ...
- Luogu P1471 方差 线段树
那是上上周...也是重构了四遍...后来GG了...今天又拾起,搞了搞终于过了... 好吧就是个线段树,公式懒得推了https://www.cnblogs.com/Jackpei/p/10693561 ...
- 洛谷 P1471 方差
洛谷 P1471 方差 题目背景 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的 ...
- 【洛谷】【线段树】P1471 方差
[题目背景:] 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. [题目描述:] 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差 ...
- 洛谷——P1471 方差
P1471 方差 题目描述 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. 借一下远航之曲大佬的图片,特别清晰: 那么只要维护区间平方和,就可以 ...
- 洛谷P1471 方差
蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. ——by 洛谷; http://www.luogu.org/problem/show?pid=1 ...
- P1471 方差
题目 luogu 思路 \[\frac{1}{n}*\sum_{1}^{n}( a_{i}-A)^{2}\] \[\frac{1}{n}*\sum_{1}^{n}( a_{i}^2-2*A*a_{i} ...
- 2018.08.16 洛谷P1471 方差(线段树)
传送门 线段树基本操作. 把那个方差的式子拆开可以发现只用维护一个区间平方和和区间和就可以完成所有操作. 同样区间修改也可以简单的操作. 代码: #include<bits/stdc++.h&g ...
随机推荐
- Lua与javascript的差异
Lua与javascript的差异 2010-03-08 Lua模拟器js方案 1.语法级模拟 lua与js语言差异 1.1注释 js 为//,lua为--. 1.2变量 js利用var来声明全局变量 ...
- WuKong
WuKong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 2016 ACM/ICPC Asia Regional Dalian Online Football Games
Football Games Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- Linux上MySQL的安装
a.检测是否安装了mysql rpm -qa | grep mysql b.卸载系统自带的mysql rpm -e --nodeps 卸载的包 rpm -e --nodeps mysql-libs- ...
- .Net Core2.0秒杀CMS部署到Centos7.3遇到的坑,酸爽呀
一.Centos7.3的安装 打开VirtualBox,点击新建,如下图所示: 点击“下一步”,弹出下面的对话框,调整内存大小,建议设置为2G,这样操作更流畅点 设置好,点击“OK”,再点击“启动”, ...
- Linux系列教程(十八)——Linux文件系统管理之文件系统常用命令
通过前面两篇博客,我们介绍了Linux系统的权限管理.Linux权限管理之ACL权限 介绍了通过设定 ACL 权限,我们为某个用户指定某个文件的特定权限,这在Linux只能对于一个文件只能有所有者权限 ...
- [深度学习]实现一个博弈型的AI,从五子棋开始(1)
好久没有写过博客了,多久,大概8年???最近重新把写作这事儿捡起来……最近在折腾AI,写个AI相关的给团队的小伙伴们看吧. 搞了这么多年的机器学习,从分类到聚类,从朴素贝叶斯到SVM,从神经网络到深度 ...
- WebSocket小插件
一.WebSocket小介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信 ...
- 我的第一个python web开发框架(16)——产品分类管理
产品分类管理的html页面之前忘记做了,这次附件里补上. 好了先上图 从页面效果图来看,我们需要开发列表获取接口.添加接口.单条记录获取接口.编辑接口和删除接口 对于产品分类列表,我们将使用jqgri ...
- 2017/10/10 jar包错误
Description Resource Path Location Type Archive for required library: 'WebContent/WEB-IN ...