【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 ...
随机推荐
- Java设计模式探讨之单例模式
单例模式是在平时的项目开发中比较常见的一种设计模式,使用比较普遍,网上的资料也是一抓一大把,小Alan也来凑凑热闹,为以后充实点设计模式相关的内容做个简单的开篇. 单例模式是一种创建对象的模式,用于产 ...
- windows环境中利用NMake工具编译连接C++源代码
这篇文章是上一篇文章(http://www.cnblogs.com/LCCRNblog/p/4532643.html)的补充,因此需要先看看上一篇文章. 最近在写代码的时候,需要通过命令的方式来执行生 ...
- 哈尔滨理工大学第六届程序设计团队 H-Permutation
/* 数学是硬伤......推了半小时推出来一个错误的公式 */ #include <iostream> #include <stdio.h> #include <alg ...
- Python入门学习(一)
看完了莫烦Python的视频,对于Python有了一点感觉,接下来打算把小甲鱼的视频啃完,附上学习网址:http://blog.fishc.com/category/python 小甲鱼的视频是从零基 ...
- 让普通 Java 类自动感知 Activity Lifecycle
背景 在 Android 开发中,我们都很熟悉 Activity 的 Lifecycle,并且会在特定的 Lifecycle 下执行特定的操作.当然,我们清楚 Lifecycle 本身是带有 Andr ...
- flask中下载服务器上特定路径的文件
使用flask下载服务器上某个路径下的文件 path:文件路径以及需要下载的文件,直接写入参数有安全隐患,实际应用中需要判断权限之类的 from flask import send_file, mak ...
- GCC 中的编译器堆栈保护技术
GCC 中的编译器堆栈保护技术 前几天看到的觉得不错得博客于是转发了,但这里我补充一下一些点. GCC通过栈保护选项-fstack-protector-all编译时额外添加两个符号,__stack_c ...
- Android开发之漫漫长途 Ⅳ——Activity的显示之ViewRootImpl初探
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- ASP.NET Core 应用程序Startup类介绍
Startup类配置服务和应用程序的请求管道. Startup 类 ASP.NET Core应用程序需要一个启动类,按照惯例命名为Startup.在主程序的Web Host生成器(WebHostBui ...
- 通过hibernate封装数据库持久化过程回顾泛型/继承/实现等概念
前言 在开发过程中,我们不难发现,客户的需求以及产品的定位对开发内容的走向有很大的决策作用,而这些往往需要在一开始就尽可能考虑周全和设计完善.为什么说是尽可能,因为我们都知道,需求这种东西,一言难尽. ...