当前位置: 首页 > news >正文

P1471 方差

#算法/线段树

https://www.luogu.com.cn/problem/P1471

好久没刷算法题了,现在生疏了好多

求方差时:
假设求1-n的方差
res=((a1−div(a))2+(a2−(div(a))2+...+(an−div(a))2)/n res=((a_1-div(a))^2+(a_2-(div(a))^2+...+(a_n-div(a))^2)/n res=((a1div(a))2+(a2(div(a))2+...+(andiv(a))2)/n
分解
res=((a12+a22+...+an2)−2div(a)(a1+a2+..+an)+ndiv(a)2)/n res=((a_1^2+a_2^2+...+a_n^2)-2div(a)(a_1+a_2+..+a_n)+ndiv(a)^2)/n res=((a12+a22+...+an2)2div(a)(a1+a2+..+an)+ndiv(a)2)/n
a1+a2+...+an=div(a)∗na_1+a_2+...+a_n=div(a)*na1+a2+...+an=div(a)n
res=(a12+a22+...+an2)/n−div(a)2 res=(a_1^2+a_2^2+...+a_n^2)/n-div(a)^2 res=(a12+a22+...+an2)/ndiv(a)2
当我们对一个方差进行改变时
(a1+x)2+(a2+x)2+...(an+x)2=(a12+a22+...+an2)+2x(a1+a2+...+an)+nx2 (a_1+x)^2+(a_2+x)^2+...(a_n+x)^2=(a_1^2+a_2^2+...+a_n^2)+2x(a_1+a_2+...+a_n)+nx^2 (a1+x)2+(a2+x)2+...(an+x)2=(a12+a22+...+an2)+2x(a1+a2+...+an)+nx2
(a1+x)2+...+(an+x)2=(a12+a22+a32+...+an2)+2x(a1+a2+...+an)+nx2 (a_1+x)^2+...+(a_n+x)^2=(a_1^2+a_2^2+a_3^2+...+a_n^2)+2x(a_1+a_2+...+a_n)+nx^2 (a1+x)2+...+(an+x)2=(a12+a22+a32+...+an2)+2x(a1+a2+...+an)+nx2
在构建线段树时候,我们可以构建两个数组,一个存取总和,一个存取平方和,进行区间加减时,只需对两个数组进行变化即可.

[[线段树]]
代码

#include<iostream>#include<string>#include<stdio.h>using namespace std;const int N=1e6+10;typedef double db;db mark[N];db seg[N];db seg2[N];db a[N];#define lc p<<1#define rc p<<1|1void push_up(int p){seg[p]=seg[lc]+seg[rc];seg2[p]=seg2[lc]+seg2[rc];}void build(int p,int l,int r){if(l>=r){seg[p]=a[l];seg2[p]=a[l]*a[l];mark[p]=0;return;}int mid=l+r>>1;build(lc,l,mid);build(rc,mid+1,r);push_up(p);}bool inRange(int l,int r,int L,int R){if(l>=L&&r<=R)return true;return false;}bool outRange(int l,int r,int L,int R){if(r<L||l>R)return true;return false;}void push_down(int p,int len){if(mark[p]){//左区间的长度=l+r>>1,会比右区间多1个seg2[lc]+=2.0*mark[p]*seg[lc]+1.0*(len-len/2)*mark[p]*mark[p];seg[lc]+=mark[p]*(len-len/2);mark[lc]+=mark[p];//注意这里长度一定要写成(len/2),不能把括号忘了seg2[rc]+=2.0*mark[p]*seg[rc]+1.0*(len/2)*mark[p]*mark[p];seg[rc]+=mark[p]*(len/2);mark[rc]+=mark[p];mark[p]=0;}}void update(int p,int l,int r,int L,int R,db k){if(inRange(l,r,L,R)){seg2[p]=seg2[p]+2.0*k*seg[p]+(r-l+1)*k*k;seg[p]+=1.0*(r-l+1)*k;mark[p]+=k;return;}if(outRange(l,r,L,R)){return;}push_down(p,r-l+1);int mid=l+r>>1;update(lc,l,mid,L,R,k);update(rc,mid+1,r,L,R,k);push_up(p);}db query_sum(int p,int l,int r,int L,int R){if(inRange(l,r,L,R)){return seg[p];}if(outRange(l,r,L,R)){return 0;}push_down(p,r-l+1);int mid=l+r>>1;db sum=query_sum(lc,l,mid,L,R);sum+=query_sum(rc,mid+1,r,L,R);push_up(p);return sum;}db query_sum2(int p,int l,int r,int L,int R){if(inRange(l,r,L,R)){return seg2[p];}if(outRange(l,r,L,R)){return 0;}push_down(p,r-l+1);int mid=l+r>>1;db sum=query_sum2(lc,l,mid,L,R);sum+=query_sum2(rc,mid+1,r,L,R);push_up(p);return sum;}int main(void){int n,m;cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];build(1,1,n);//   cout<<query_sum(1,1,n,1,n)<<endl;for(int i=1;i<=m;i++){db opt,x,y,k;cin>>opt;if(opt==1){cin>>x>>y>>k;update(1,1,n,x,y,k);}else if(opt==2){cin>>x>>y;printf("%.4lf\n",query_sum(1,1,n,x,y)/(y-x+1));}else if(opt==3){cin>>x>>y;db sum=query_sum(1,1,n,x,y);db div=sum/(y-x+1);db sum2=query_sum2(1,1,n,x,y);// cout<<sum<<' '<<sum2<<endl;printf("%.4lf\n",sum2/(y-x+1)-(div*div));}}}
http://www.dtcms.com/a/431351.html

相关文章:

  • 【开题答辩全过程】以 Puk苍白游戏论坛网为例,包含答辩的问题和答案
  • Java包装类与泛型详解
  • 举报非法网站要求做笔录昌乐网站建设
  • 个人网站作品欣赏杭州开发网站的公司哪家好
  • 12-Redis+有序集合类型实战指南:从分数排序到排行榜场景落地
  • 延时任务之Redis 过期事件监听原理与缺陷
  • Redis 扩展数据类型
  • 汕头企业网站建设设计班级网站 模板
  • 拉格朗日乘子法
  • 电商网站设计是干什么的高碑店网站建设价格
  • 网站源代码制作四大门户网站对比分析
  • 教学网站开发背景及意义怎样下载黑龙江人社app
  • 系统环境异常、网络适配难,黑科技一站式解决
  • 【APK安全】系统管理器安全风险与防御指南
  • 有做淘宝网站的在线网络制作系统
  • 【VSCode中Java开发环境配置的三个层级之Maven篇】(Windows版)
  • 10.1 刷题心得
  • 前端-Vue工程化
  • 深圳企业网站制作中心用网站做CAN总线通信好吗
  • 中山移动网站建设报价三室一厅二卫装修效果图
  • .net商城网站开发做封面的地图网站
  • 复习一下Cpp(1)
  • 什么网站访问量公司变更地址需要多少钱
  • final字段单元测试
  • 车载Class D功放电源脚烧蚀可能原因
  • 34线城市做网站推广最新新闻事件摘抄
  • 嵌入式ARM程序高级调试技能:26. ARM Linux CPU高负载分析:系统调用过多导致的线程高负载案例
  • 无锡企业自助建站系统网站开发和游戏开发的区别
  • 外贸网站平台都有哪些平台毕业设计做网站简单吗
  • dotnet-sdk-5.0.408-win-x64安装教程(附详细步骤和附安装包)