Luogu P1471 方差
题目传送门
开了十倍空间才过是什么鬼?该不会我线段树炸了吧……
细思极恐
平均数都会求,维护区间和,到时候除一下就好了。
方差的求法如下
(用的Luogu的图片)
因为要维护一个平方,我们可以考虑使用van♂完全平方公式将它拆开,这样只用线段树维护区间和和区间平方和就可以了。
对于区间修改,同样使用完全平方公式。
要注意的一点是,修改时,要先修改平方和,再修改和,因为我们修改平方和时要用到区间和。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define ls p<<1
#define rs p<<1|1
#define mid ((l+r)>>1)
using namespace std;
struct zzz{double sum,pf;
}tree[1000010<<2];
double tag[1000010<<2],a[1000010];
inline void up(int p){tree[p].sum=tree[ls].sum+tree[rs].sum;tree[p].pf=tree[ls].pf+tree[rs].pf;
}
void build(int l,int r,int p){if(l==r){tree[p].sum=a[l];tree[p].pf=a[l]*a[l];return ;}build(l,mid,ls); build(mid+1,r,rs);up(p);
}
inline void down(int l,int r,int p){
//用完全平方公式修改平方和tree[ls].pf+=2*tree[ls].sum*tag[p]+tag[p]*tag[p]*(mid-l+1);tree[rs].pf+=2*tree[rs].sum*tag[p]+tag[p]*tag[p]*(r-mid);
//维护区间和tree[ls].sum+=tag[p]*(mid-l+1);tree[rs].sum+=tag[p]*(r-mid);tag[ls]+=tag[p]; tag[rs]+=tag[p]; tag[p]=0;
}
void update(int l,int r,int p,int nl,int nr,double k){if(l>=nl&&r<=nr){tree[p].pf+=2*tree[p].sum*k+k*k*(r-l+1);tree[p].sum+=k*(r-l+1);tag[p]+=k;return ;}down(l,r,p);if(nl<=mid) update(l,mid,ls,nl,nr,k);if(nr>mid) update(mid+1,r,rs,nl,nr,k);up(p);
}
double query(int l,int r,int p,int nl,int nr){double ans=0;down(l,r,p);if(l>=nl&&r<=nr) return tree[p].sum;if(nl<=mid) ans+=query(l,mid,ls,nl,nr);if(nr>mid) ans+=query(mid+1,r,rs,nl,nr);return ans;
}
double query2(int l,int r,int p,int nl,int nr){double ans=0;down(l,r,p);if(l>=nl&&r<=nr) return tree[p].pf;if(nl<=mid) ans+=query2(l,mid,ls,nl,nr);if(nr>mid) ans+=query2(mid+1,r,rs,nl,nr);return ans;
}
int read(){int k=0,f=1; char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-') f=-1;for(;c>='0'&&c<='9';c=getchar())k=k*10+c-48;return k*f;
}
int main(){int n=read(),m=read();for(int i=1;i<=n;i++) scanf("%lf",&a[i]);build(1,n,1);for(int i=1;i<=m;i++){int opt=read(),l=read(),r=read();if(opt==1){double k; scanf("%lf",&k);update(1,n,1,l,r,k);}if(opt==2){printf("%.4lf\n",query(1,n,1,l,r)/(r-l+1));}if(opt==3){double sum=query(1,n,1,l,r);double pj=sum/(r-l+1);double pf=query2(1,n,1,l,r);printf("%.4lf\n",(pf-2*sum*pj+pj*pj*(r-l+1))/(r-l+1));}}return 0;
}
转载于:https://www.cnblogs.com/wxl-Ezio/p/9911258.html
Luogu P1471 方差相关推荐
- luogu P1471 方差 P5142 区间方差
背景: 话说今天晚上就要去丰山那边上课了. 数学竞赛昨天考完了,碰见几个某 J J J中学的朋友(政治敏感话题), 好像看反了题. 又合并了两道题. 题目传送门: https://www.luogu. ...
- 近期打算及毕业前要补完的题
之前总是开玩笑的说"退竞了退竞了",这次看来是真的退役了.想想这一年来的学习历程,有欢笑也有汗水.可能还是因为自己太菜,可能还是因为自己不够努力,最终还是滚去学文化课了. 辜负了教 ...
- 2021-07-08~2021-07-22总结--zhengjun
目录在此 2021-07-08~2021-07-22总结--zhengjun 7.8 考试过程 学习的算法 AC的题目 正在调试的题目 7.9 考试过程 学习的内容 AC的题目 正在调试的题目 7.1 ...
- 暑假训练-义乌(7.8-7.15)
暑假训练 模拟赛 图表 数据 7.8(lxl) 7.9(lxl) 7.10(lxl) 7.11(lxl) 7.12(wls) 7.13(wls) 7.14(wls) 7.15(lfds) 训练 数据结 ...
- luogu P5142 区间方差(线段树、乘法逆元)
luogu P5142 区间方差 本题要求维护模区间方差,很明显是一道数据结构题. 我们化简方差公式: 而平均数等于 可以发现,我们只需要维护序列的区间和和区间平方和,就可以维护平均数和方差. 区间和 ...
- luogu 1471
题意: 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. 操作1:1 x y k ,表示将第x到第y项每项加上k,k为一实数. 操作2:2 x y ...
- P7962-[NOIP2021]方差【dp,差分】
正题 题目链接:https://www.luogu.com.cn/problem/P7962 题目大意 给出一个长度为nnn的序列aaa,你每次可以让一个ai(1<i<n)=ai−1+ai ...
- 什么是高/低方差、高/低偏差、(推荐阅读)
2021071 https://www.pianshen.com/article/71161696005/ 方差是对多个样本集的比较而言? 摘要:在现实任务中,我们往往有多种学习算法可供选择,甚至对同 ...
- luogu P1549 棋盘问题(2) 题解
luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...
最新文章
- 世界硬币:比特币类似的评分系统!
- 设置Qt应用程序图标
- QML学习笔记-对QML基本认识
- oracle基础学习---------1
- Nginx报错:upstream timed out (110: Connection timed out)和client intended to send too large body【转】...
- 60-40-040-序列化-Twitter 的Avro序列化
- easyui弹出层在最顶层显示跳出iframe框架通用javascript代码
- iOS-项目开发1-UIImage
- 屏蔽登录QQ后总是弹出的QQ网吧页面
- 理解Java - JDK动态代理原理
- windows下双击可运行的Java软件打包方案
- 基于python的销售系统_python实现超市商品销售管理系统
- FM信号测试软件,音频测试方案:音频FM指标测试方法
- 精度、召回率、准确率、F-score
- FAT32、exFAT、NTFS
- Linxu-解压压缩命令
- 苹果一体机装win10系统无声音
- Vue+SpringBoot实现Excel在线预览功能(PS:添加样式比较费劲)
- vm fusion Linux系统克隆
- 植物大战僵尸设计元素浅析