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】方差的更多相关文章

  1. Luogu P1471 方差

    题目传送门 开了十倍空间才过是什么鬼?该不会我线段树炸了吧-- 细思极恐 平均数都会求,维护区间和,到时候除一下就好了. 方差的求法如下 (用的Luogu的图片) 因为要维护一个平方,我们可以考虑使用 ...

  2. 【题解】Luogu P1471 方差

    原题传送门 简单进行推导之后,就能发现很妙的结论 用线段树维护区间和,区间平方和就珂以算出结果 #include <bits/stdc++.h> #define db double #de ...

  3. Luogu P1471 方差 线段树

    那是上上周...也是重构了四遍...后来GG了...今天又拾起,搞了搞终于过了... 好吧就是个线段树,公式懒得推了https://www.cnblogs.com/Jackpei/p/10693561 ...

  4. 洛谷 P1471 方差

    洛谷 P1471 方差 题目背景 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的 ...

  5. 【洛谷】【线段树】P1471 方差

    [题目背景:] 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. [题目描述:] 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差 ...

  6. 洛谷——P1471 方差

    P1471 方差 题目描述 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. 借一下远航之曲大佬的图片,特别清晰: 那么只要维护区间平方和,就可以 ...

  7. 洛谷P1471 方差

    蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. ——by 洛谷; http://www.luogu.org/problem/show?pid=1 ...

  8. 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} ...

  9. 2018.08.16 洛谷P1471 方差(线段树)

    传送门 线段树基本操作. 把那个方差的式子拆开可以发现只用维护一个区间平方和和区间和就可以完成所有操作. 同样区间修改也可以简单的操作. 代码: #include<bits/stdc++.h&g ...

随机推荐

  1. 对es6中Promise和async的理解

    Promise var promise = new Promise((resolve,reject)=>{ resolve(value); //reject(value) }); //promi ...

  2. 请求返回时的Size/Content Time/Latency的区别

    Size/Content: Size是响应头部和响应体结合起来的大小,Content是请求内容解码后的大小.进一步了解可以看这里Chrome Dev Tools - “Size” vs “Conten ...

  3. HTML学习笔记 css定位(静态,相对,固定,绝对布局)偏移案例 第十二节 (原创) 参考使用表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 学Java的前景与就业,资深程序员教你怎么开始学Java!

    IT行业一直是就业的热门岗位,程序员这个职业稳定性和收入比都有着不错的前景,那么学Java的前景和就业是什么样的呢?随着入行Java的准程序员越来越多,各种学习Java的流派也层出不穷!其实在编程的世 ...

  5. [转载] 谷歌技术"三宝"之谷歌文件系统

    转载自http://blog.csdn.net/opennaive/article/details/7483523 题记:初学分布式文件系统,写篇博客加深点印象.GFS的特点是使用一堆廉价的商用计算机 ...

  6. [转载] ConcurrentHashMap原理分析

    转载自http://blog.csdn.net/liuzhengkang/article/details/2916620 集合是编程中最常用的数据结构.而谈到并发,几乎总是离不开集合这类高级数据结构的 ...

  7. Javaweb学习(一):tomcat服务器配置与启动

    目前所使用的集成开发环境为myeclipse10.7,tomcat版本为apache-tomcat-7.0.82,部分编写地方可能有所不同,但是工具不是最主要的,重要的是掌握的知识. tomcat在m ...

  8. 使用JavaScript生成二维码教程-附qrcodejs中文文档

    使用javascript生成二维码 依赖jquery 需要使用到的库 https://github.com/davidshimjs/qrcodejs DIV <div id="qrco ...

  9. 基于HTML5 Canvas 点击添加 2D 3D 机柜模型

    今天又返回好好地消化了一下我们的数据容器 DataModel,这里给新手做一个典型的数据模型事件处理的例子作为参考.这个例子看起来很简单,实际上结合了数据模型中非常重要的三个事件处理的部分:属性变化事 ...

  10. webpack 3.X学习之JS压缩与打包HTML文件

    js压缩 webpack自带一个插件uglifyjs-webpack-plugin来压缩js,所以不需要再次安装,当一切都准备妥当,引入uglifyjs-webpack-plugin模块: const ...