2018.08.16 洛谷P1471 方差(线段树)
传送门
线段树基本操作。
把那个方差的式子拆开可以发现只用维护一个区间平方和和区间和就可以完成所有操作。
同样区间修改也可以简单的操作。
代码:
#include<bits/stdc++.h>
#define N 300005
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
using namespace std;
int n,m;
double a[N];
struct Node{int l,r;double sum,mulsum,tag;}T[N<<2];
inline void pushup(int p){T[p].sum=T[lc].sum+T[rc].sum,T[p].mulsum=T[lc].mulsum+T[rc].mulsum;}
inline void pushnow(int p,double v){T[p].mulsum+=2*v*T[p].sum+v*v*(T[p].r-T[p].l+1),T[p].sum+=(T[p].r-T[p].l+1)*v,T[p].tag+=v;}
inline void pushdown(int p){if(T[p].tag)pushnow(lc,T[p].tag),pushnow(rc,T[p].tag),T[p].tag=0;}
inline void build(int p,int l,int r){
T[p].l=l,T[p].r=r,T[p].tag=0;
if(l==r){T[p].sum=a[l],T[p].mulsum=a[l]*a[l];return;}
build(lc,l,mid),build(rc,mid+1,r),pushup(p);
}
inline void update(int p,int ql,int qr,double v){
if(ql>T[p].r||qr<T[p].l)return;
if(ql<=T[p].l&&T[p].r<=qr)return pushnow(p,v);
pushdown(p);
if(qr<=mid)update(lc,ql,qr,v);
else if(ql>mid)update(rc,ql,qr,v);
else update(lc,ql,mid,v),update(rc,mid+1,qr,v);
pushup(p);
}
inline double query(int p,int ql,int qr,int op){
if(ql>T[p].r||qr<T[p].l)return 0;
if(ql<=T[p].l&&T[p].r<=qr)return op?T[p].mulsum:T[p].sum;
pushdown(p);
if(qr<=mid)return query(lc,ql,qr,op);
if(ql>mid)return query(rc,ql,qr,op);
return query(lc,ql,mid,op)+query(rc,mid+1,qr,op);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)scanf("%lf",&a[i]);
build(1,1,n);
while(m--){
int op,l,r;
scanf("%d%d%d",&op,&l,&r);
if(op==1){
double k;
scanf("%lf",&k),update(1,l,r,k);
}
else if(op==2)printf("%.4lf\n",query(1,l,r,0)/(r-l+1));
else{
double tmp=query(1,l,r,0)/(r-l+1);
printf("%.4lf\n",query(1,l,r,1)/(r-l+1)-tmp*tmp);
}
}
return 0;
}
2018.08.16 洛谷P1471 方差(线段树)的更多相关文章
- 2018.08.16 洛谷P1437 [HNOI2004]敲砖块(二维dp)
传送门 看起来普通dp" role="presentation" style="position: relative;">dpdp像是有后效性的 ...
- 2018.08.16 洛谷P3607 [USACO17JAN]序列反转(线性dp)
传送门 一道感觉比较简单的dp. 注意是要求翻转一个子序列而不是一段连续的数(被坑了很多次啊)... 看到数据范围果断开一个四维数组来dp一波. 我们显然可以用f[i][j][k][t]表示下标在[l ...
- 2018.08.16 洛谷P2029 跳舞(线性dp)
传送门 简单的线性dp" role="presentation" style="position: relative;">dpdp. 直接推一推 ...
- 洛谷 P1471 方差
洛谷 P1471 方差 题目背景 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的 ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 【洛谷】【线段树】P1471 方差
[题目背景:] 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. [题目描述:] 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差 ...
- 2018.08.28 洛谷P4556 [Vani有约会]雨天的尾巴(树上差分+线段树合并)
传送门 要求维护每个点上出现次数最多的颜色. 对于每次修改,我们用树上差分的思想,然后线段树合并统计答案就行了. 注意颜色很大需要离散化. 代码: #include<bits/stdc++.h& ...
- 2018.08.11 洛谷P3224 [HNOI2012]永无乡(线段树合并)
传送门 给出n个带点权的点,支持连边和查询连通块第k大. 这个貌似就是一道线段树合并的裸板啊... 代码: #include<bits/stdc++.h> #define N 100005 ...
- 洛谷P1471 方差
蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. ——by 洛谷; http://www.luogu.org/problem/show?pid=1 ...
随机推荐
- myeclipse2016-ci破解疑难杂症问题整理
感谢网上的各位大神,在你们的基础,我又整理了下安装成功的心得,破解不成功时一定注意下红色字体内容,避免被坑,都是教训. 试了网上N种破解工具+方法,Myeclipse 2016装了很多遍(本人官网下载 ...
- js倒计时发送验证码按钮
var wait=60; function time(o) { if (wait == 0) { o.removeAttribute("disabled"); o.value=&q ...
- 前端-javascript-正则表达式
1.概念 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...
- JAVA发送HttpClient请求及接收请求结果过程
1.写一个HttpRequestUtils工具类,包括post请求和get请求 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ...
- Haskell语言学习笔记(29)CPS
CPS (Continuation Passing Style) CPS(延续传递风格)是指函数不把处理结果作为返回值返回而是把处理结果传递给下一个函数的编码风格. 与此相对,函数把处理结果作为返回值 ...
- 判断TrueType字体
function IsTrueTypeFont(FontName : string) : boolean;const PITCH_MASK: byte = $0F; var TxMetric: ...
- 使用 ImageEnView 给图片加水印,及建缩略图
摘要: 使用 ImageEnView 给图片加水印,及建缩略图 {Power by hzqghost@21cn.com}unit CutWater; interface uses Math,imag ...
- HTML转义
HTML转义 模板对上下文传递的字符串进行输出时,会对以下字符自动转义 小于号< 转换为< 大于号> 转换为> 单引号' 转换为' 双引号" 转换为 " 与 ...
- Mysql delete操作
以下摘自官方文档:https://dev.mysql.com/doc/refman/5.7/en/insert.html 语法: DELETE [LOW_PRIORITY] [QUICK] [IGNO ...
- testlink问题--linux环境下
搭建testlink 时出现问题,相关解决办法: 1.Maximum Session Idle Time before Timeout 修改php.ini文件,修改成session.gc_maxlif ...