正题


题目大意

4个操作
单点修改,区间修改,区间求和,区间求方差
方差为:∑(xi−ave)2n\frac{\sum(x_i-ave)^2}{n}n∑(xi​−ave)2​
aveaveave为平均值


解题思路

我们将方差的式子分解一下
∑(xi−ave)2n\frac{\sum(x_i-ave)^2}{n}n∑(xi​−ave)2​
∑(xi2−2∗x∗ave+ave2)n\frac{\sum(x_i^2-2*x*ave+ave^2)}{n}n∑(xi2​−2∗x∗ave+ave2)​
(∑xi2)−2∗(∑xi)∗ave+n∗ave2n\frac{(\sum x_i^2)-2*(\sum x_i)*ave+n*ave^2}{n}n(∑xi2​)−2∗(∑xi​)∗ave+n∗ave2​
然后因为aveaveave可以用区间和求,所以我们只需要多维护一个区间平方和
之后我们考虑如何快速计算,对于一个区间所有数都加上valvalval,之后的平方和
∑(xi+val)2\sum (x_i+val)^2∑(xi​+val)2
我们将其分解
∑(xi2+2∗xi∗val+val2)\sum (x_i^2+2*x_i*val+val^2)∑(xi2​+2∗xi​∗val+val2)
(∑xi2)+(∑xi)∗2∗val+n∗val2(\sum x_i^2)+(\sum x_i)*2*val+n*val^2(∑xi2​)+(∑xi​)∗2∗val+n∗val2
然后(∑xi2)(\sum x_i^2)(∑xi2​)和(∑xi)(\sum x_i)(∑xi​)我们都知道,所以可以直接计算之后的平方和。


codecodecode

#include<cstdio>
#define N 100010
#define ll long long
#define lodu long double
using namespace std;
struct tree_node{ll l,r,w,ww,lazy;
}t[N<<2];
ll n,q;
lodu sum_f;
void build(ll k,ll l,ll r)//建树
{t[k].l=l;t[k].r=r;if(l==r){scanf("%lld",&t[k].w);t[k].ww=t[k].w*t[k].w;return;}ll mid=(l+r)>>1;build(k*2,l,mid);build(k*2+1,mid+1,r);t[k].w=t[k*2].w+t[k*2+1].w;t[k].ww=t[k*2].ww+t[k*2+1].ww;
}
void get_fan(ll k,ll z)//求区间加了z之后的区间平方和
{t[k].ww=t[k].ww+t[k].w*2*z+z*z*(t[k].r-t[k].l+1);}
void downdata(ll k){if(t[k].lazy==0) return;get_fan(k*2,t[k].lazy);get_fan(k*2+1,t[k].lazy); t[k*2].w+=t[k].lazy*(t[k*2].r-t[k*2].l+1);t[k*2+1].w+=t[k].lazy*(t[k*2+1].r-t[k*2+1].l+1);t[k*2].lazy+=t[k].lazy;t[k*2+1].lazy+=t[k].lazy;t[k].lazy=0;
}//下传lazy标记
void change(ll k,ll l,ll r,ll z)//区间修改
{if(t[k].l==l&&t[k].r==r){get_fan(k,z);t[k].lazy+=z;t[k].w+=z*(r-l+1);return;}downdata(k);if(r<=t[k*2].r) change(k*2,l,r,z);else if(l>=t[k*2+1].l) change(k*2+1,l,r,z);else change(k*2,l,t[k*2].r,z),change(k*2+1,t[k*2+1].l,r,z);t[k].ww=t[k*2].ww+t[k*2+1].ww;t[k].w=t[k*2].w+t[k*2+1].w;
}
ll get_sum(ll k,ll l,ll r)//区间求和和平方和
{if(t[k].l==l&&t[k].r==r){sum_f+=t[k].ww;return t[k].w;}downdata(k);if(r<=t[k*2].r) return get_sum(k*2,l,r);if(l>=t[k*2+1].l) return get_sum(k*2+1,l,r);return get_sum(k*2,l,t[k*2].r)+get_sum(k*2+1,t[k*2+1].l,r);
}
int main()
{//freopen("data.in","r",stdin);//freopen("data.out","w",stdout);scanf("%lld%lld",&n,&q);build(1,1,n);for(ll i=1;i<=q;i++){ll ts,a,b,z;scanf("%lld%lld%lld",&ts,&a,&b);if(ts==0) change(1,a,a,b);else if(ts==1){scanf("%lld",&z);change(1,a,b,z);}else if(ts==2) sum_f=0,printf("%lld\n",get_sum(1,a,b));else{sum_f=0;lodu ave,ans,sum=get_sum(1,a,b),n=b-a+1;ave=sum/n;ans=sum_f+ave*ave*n-sum*ave*2; printf("%0.10Lf\n",ans/n);}}
}

jzoj4231-寻找神格【线段树,数学】相关推荐

  1. 【JZOJ4231】寻找神格

    description 淬炼完神体,王仙女被传送到了遥远处一座没有神雷的浮岛上,发现浮岛上除了一扇门以外什么都没有.他来到门前,发现上面写着这样一段话: 一个神出了拥有强大的神体外,还需要一枚神格.然 ...

  2. JZOJ 4231. 寻找神格

    题目 Description 淬炼完神体,王仙女被传送到了遥远处一座没有神雷的浮岛上,发现浮岛上除了一扇门以外什么都没有.他来到门前,发现上面写着这样一段话: 一个神出了拥有强大的神体外,还需要一枚神 ...

  3. P6327 区间加区间sin和 线段树 + 数学

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的序列aaa,有mmm次操作,每次操作分两种类型: (1)l,r,v(1)l,r,v(1)l,r,v,将al,al+1,...,ara_l ...

  4. CF311D Interval Cubing 数学、线段树

    CF311D Interval Cubing 数学.线段树 数学太重要了..有些人知道点结论就喜欢搞个数学包装水题,欺负吾等数学学渣啊... CF有官方题解,不过我还是记录一下吧. 这是个线段树的经典 ...

  5. BZOJ2957:楼房重建(线段树)

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

  6. python线段树编写,很冗长,不过不难理解。

    python线段树编写 前言 一.题目及代码编写 二.补充说明 三.总结 前言 以LC 729. 我的日程安排表 I 为例 这道题不推荐使用这种解法 非常的慢,而且代码超级容易记错! 你没看错 记错! ...

  7. hdu.3308 LCIS(线段树,区间合并+单点更新)

    按照傻崽大神的线段树修炼路线,自己做的第二道区间合并的题. 问题比较简单明了,区间求最长连续上升子序列,但是是需要单点更新的 n个数, m组操作 Q A B 询问[A,B]区间的最长连续上升子序列: ...

  8. [BZOJ1018]SHOI2008堵塞的交通|线段树

    好神的线段树题,以前只会维护区间什么数值信息的,竟然还可以维护联通性,好题啊,涨姿势了.. 由于只有两行嘛,要保证线段树节点有可加性,我们维护六个信息,分别是右上到右下,右上到左上,右上到左下,右下到 ...

  9. 小C的数学问题 线段树+分治

    题目描述 小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题. 让他在1天的时间内给出答案. 但是小C不会这问题,现在他来请教你. 请你帮他解决这个问题. 有n个数,每个数有权 ...

最新文章

  1. python文件和目录
  2. python CST中国标准时间格式转换
  3. Layout两列定宽中间自适应三列布局
  4. DeepLab v2
  5. python 简单的server请求
  6. php常用快捷键,phpstorm常用快捷键
  7. rocketmq订阅多个主题_RocketMQ 的消息模型
  8. 如何备份和还原您的Kubernetes集群资源和持久卷?
  9. 搭建nfs共享存储服务之二nfs服务端配置
  10. python time模块计时_python中计时模块timeit的使用方法
  11. 宏定义中#和##的用法
  12. 简单好用的Mac设置
  13. 集成电路制造及工艺 主要名词解释
  14. 使用爬虫自动登录QQ空间
  15. 2000坐标系xy坐标几位_2000国家大地坐标系简介
  16. U盘做启动盘后无法格式化使用
  17. 全球计算机科学和电子,科学网—[转载]【喜报】祝贺IEEE TCSS入选全球计算机与电子领域Top 1000期刊 - 王飞跃的博文...
  18. 思科2960-S交换机初始化配置
  19. RFX2401C 2.4GHz功放PA前端模块
  20. java读取execle

热门文章

  1. postgis数据库优化_国内首个 Serverless 数据库来了,技术架构全揭秘!
  2. dhcp服务器显示主机名,linux – 当我没有在dhclient.conf中定义一个时,我的DHCP服务器如何知道我的机器的主机名?...
  3. java thread join()_Java Thread join() 的用法
  4. 在计算机科学中计算是指,在计算机中数值计算是指什么
  5. 读取oracle bfile字段,ORACLE中BFILE字段的使用研究_oracle
  6. 西门子触摸屏脚本程序_通过驿唐PLC501远程下载Smart Line触摸屏
  7. leetcode84. 柱状图中最大的矩形
  8. C++中有关queue常用函数的用法及其注意要项
  9. mysql 固定符号分列显示_MySql中指定符号分割并分行展示
  10. [数据结构-严蔚敏版]P61ADT Queue的表示与实现(单链队列-队列的链式存储结构)