【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 ...
随机推荐
- spring mvc常用注解的说明
最近一段时间学习了springboot,所以熟悉一下mvc中常用的注解,这样可以方便开发 简介: @RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类 ...
- jsoup从表单中取数据
表单的格式如下 <td>user</td> <td>cc</td> </tr> <tr> <td>pass</ ...
- 【翻译】.Net Core的意义
想要了解.Net Core的意义,就必须要了解拥有很长历史的.Net Framework,.Net Framework1.0于2002年发布.从那开始,每隔两年就会有一个主版本推出.伴随着Visual ...
- js input输入事件兼容性问题
if(navigator.userAgent.indexOf('Android') > -1){ $("#sign").on("input", funct ...
- HTML5与phonegap接口对比
HTML5与phonegap接口对比 接口 HTML5 phonegap 差异 地理定位 geolocation 单次定位: navigator.geolocation.getCurrentPosit ...
- javascript 备忘 细节 相关
DOMContentLoaded事件触发时机,即dom tree完成但页面未必渲染完毕. var a = [1,2,3,4]; var length = a.length; alert((leng ...
- 常见的XSS攻击代码
第一类: <tag on*=*/> 在html标签事件中触发,典型的是on*事件,但是这种触发模式的缺陷在于不能直接触发所以更多的需要配合使用. eg: 1.使html元素占据整个显示页面 ...
- Vue.js—组件快速入门以及实例应用
上次我们学习了Vue.js的基础,并且通过综合的小实例进一步的熟悉了Vue.js的基础应用.今天我们就继续讲讲Vue.js的组件,更加深入的了解Vue,js的使用.首先我们先了解一下什么是Vue.js ...
- Varnish 实战项目
实现基于Keepalived+Haproxy+Varnish+LNMP企业级架构 原理:缓存,又称加速器,用于加速运行速度较快的设备与较慢设备之间的通信.基于程序的运行具有局部性特征其能实现加速的功能 ...
- C#模拟登录总结
/// <summary> 登录 /// </summary> /// <param name="url">< ...