洛谷P1471 方差
蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数。他想算算这个数列的平均数和方差。
——by 洛谷;
http://www.luogu.org/problem/show?pid=1471
平均数可以用线段树,维护区间和,直接维护平均数也行;
然后对于方差;她有个公式的:
S=[(a-Z)²+(b-Z)²+(c-Z)²+(d-Z)²+(e-Z)²...]/n(Z为平均数)
S=[区间平方和-2*n*平均数²+n*平均数²]/n;
S=[区间平方和-n*平均数²]/n;
所以维护个平方和就好了;
然后,平方和怎么区间加呢?
她也有个公式:
(a+z)²+(b+z)²+(c+z)²+(d+z)²+(e+z)²(你把她拆开嘛。。)
=以前平方和+(2z*(Z*n)+n*z²);
然后是代码解释,
我只打了一个Lazy,意为在该区间的子树上要区间加,然后两个线段树共用;
因为平方和修改要用区间平均数未修改的值,故两树同步修改,先改平方和;
代码如下:
#include<cstdio>
#include<iostream>
using namespace std;
double treen[];
double treen1[];
double lz[];
int n,m,R,L;
double a; void build(int ,int ,int );
void add(int ,int ,int );
double sum( int ,int ,int );
double sum1(int ,int ,int );
void down(int ,int ,int ); int main()
{
int i,j,b;
double ans,k;
scanf("%d%d",&n,&m);
build(,n,);
for(i=;i<=m;i++)
{
scanf("%d",&b);
if(b==)
{
scanf("%d%d",&L,&R);
cin>>a;
add(,n,);
}
if(b==)
{
scanf("%d%d",&L,&R);
ans=sum(,n,)/(R-L+);
printf("%.4lf\n",ans);
}
if(b==)
{
scanf("%d%d",&L,&R);
ans=sum(,n,)/(R-L+);
ans=ans*ans;
k=sum1(,n,);
ans=k/(R-L+)-ans;
printf("%.4lf\n",ans);
}
}
} void build(int l,int r,int nu)
{
if(l==r)
{
scanf("%lf",&treen[nu]);
treen1[nu]=treen[nu]*treen[nu];
return ;
}
int mid=(l+r)>>;
build(l,mid,nu<<);
build(mid+,r,(nu<<)+);
treen[nu]=(treen[nu<<]*(mid-l+)+treen[(nu<<)+]*(r-mid))/(r-l+1.0);
treen1[nu]=treen1[nu<<]+treen1[(nu<<)+];
} void add(int l,int r,int nu)
{
if(L<=l&&r<=R)
{
lz[nu]+=a;
treen1[nu]+=(r-l+)*(a**treen[nu]+a*a);
treen[nu]+=a;
return ;
}
int mid=(l+r)>>;
down(l,r,nu);
if(L<=mid)
add(l,mid,nu<<);
if(R>=mid+)
add(mid+,r,(nu<<)+);
treen[nu]=(treen[nu<<]*(mid-l+)+treen[(nu<<)+]*(r-mid))/(r-l+1.0);
treen1[nu]=treen1[nu<<]+treen1[(nu<<)+];
} double sum(int l,int r,int nu)
{
double su=;
if(L<=l&&r<=R)
{
return treen[nu]*(r-l+);
}
int mid=(l+r)>>;
down(l,r,nu);
if(L<=mid)
su+=sum(l,mid,nu<<);
if(R>=mid+)
su+=sum(mid+,r,(nu<<)+);
return su;
} double sum1(int l,int r,int nu)
{
double su=;
if(L<=l&&r<=R)
{
return treen1[nu];
}
int mid=(l+r)>>;
down(l,r,nu);
if(L<=mid)
su+=sum1(l,mid,nu<<);
if(R>=mid+)
su+=sum1(mid+,r,(nu<<)+);
return su;
} void down(int l,int r,int nu)
{
int mid=(l+r)>>;
lz[nu<<]+=lz[nu];
lz[(nu<<)+]+=lz[nu];
treen1[nu<<]+=(mid-l+)*(*treen[nu<<]*lz[nu]+lz[nu]*lz[nu]);
treen1[(nu<<)+]+=(r-mid)*(*treen[(nu<<)+]*lz[nu]+lz[nu]*lz[nu]);
treen[nu<<]+=lz[nu];
treen[(nu<<)+]+=lz[nu];
lz[nu]=;
}
//5 5
//1 1 1 1 1
//1 2 2 -1
//3 1 5
祝AC哟;
洛谷P1471 方差的更多相关文章
- 洛谷 P1471 方差
洛谷 P1471 方差 题目背景 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的 ...
- 洛谷——P1471 方差
P1471 方差 题目描述 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. 借一下远航之曲大佬的图片,特别清晰: 那么只要维护区间平方和,就可以 ...
- 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\) 段,相 ...
随机推荐
- python 时间及日期函数
本人最近新学python ,用到关于时间和日期的函数,经过一番研究,从网上查找资料,经过测试,总结了一下相关的方法. import timeimport datetime '''时间转化为时间戳: 2 ...
- js正则匹配查找
var pattern1 = /好/g; console.log(pattern1.test("你好")); 字符串查找: var pattern1 = /\w/; console ...
- [JavaScript] js判断是否在微信浏览器中打开
用JS来判断了,经过查找资料终于实现了效果, function is_weixn(){ var ua = navigator.userAgent.toLowerCase(); if(u ...
- Ubuntu14.04建立WiFi热点
整理自Ubuntu 下建立WiFi热点的方法 Ubuntu14.04 Deepin2014分享WiFi 亲测成功 方法一:network manager 用Ubuntu自带的network manag ...
- android 小米手机连接到电脑adb无法识别 解决方案
下载并安装小米手机助手 它会自动帮你安装驱动程序 安装成功后重启一下adb服务 应该就可以了
- 李洪强iOS开发之-PCH文件的配置
pch 可以用来存储共享信息,比如设备屏幕的宽度,高度.版本号等等 公用信息 Xcode 老版本会自动为我们创建pch文件,新版本开始不自动创建了,如果需要使用可以自己手动创建 创建完成后可以在里面定 ...
- easyui源码翻译1.32--EasyLoader(简单加载)
前言 扩展自$.fn.datebox.defaults,使用$.fn.datetimebox.defaults重写默认值对象.下载该插件翻译源码 源码 /** * jQuery EasyUI 1.3. ...
- SQLite入门与分析(七)---浅谈SQLite的虚拟机
写在前面:虚拟机技术在现在是一个非常热的技术,它的历史也很悠久.最早的虚拟机可追溯到IBM的VM/370,到上个世纪90年代,在计算机程序设计语言领域又出现一件革命性的事情——Java语言的出现,它与 ...
- ANDROID_MARS学习笔记_S01原始版_013_广播机制二
一.代码1.xml(1)main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayo ...
- Spring AOP实现方式三【附源码】
注解AOP实现 源码结构: 1.首先我们新建一个接口,love 谈恋爱接口. package com.spring.aop; /** * 谈恋爱接口 * * @author Administrator ...