线段树——洛谷 P1471 方差

https://www.luogu.org/problem/show?pid=1471
很久没打线段树果然炸了;
数组开小了;
以前我在洛谷发过题解说对于数组我们要怎么开;
比如n=1e5;
那么这个二叉树一定会有1e5个叶子节点;
2^17=131072;
说以我们如果建一颗满二叉树的话叶子节点必须要有131072个;
所以总结点有2^18=262144-1个;
那么我们直接开262144的数组就好了;
但是我现在发现在lazy标记下传的时候如果不判叶子节点的话,最终会访问到叶子节点下一个节点的;
所以我们还要开大一倍,变成524288;
当然我是随便开的;
没刻意压行全场最短

#include<bits/stdc++.h>
#define Ll long long
using namespace std;
const int N=1e5+5;
struct tree{int l,r;double tag,v[2];}T[N*8];
int n,m,x,y,k;
double z;
void up(int id){
    T[id].v[0]=T[id*2].v[0]+T[id*2+1].v[0];
    T[id].v[1]=T[id*2].v[1]+T[id*2+1].v[1];
}
void push(int id){
    int x=id*2,y=x+1;double z=T[id].tag;
    if(z==0)return;T[id].tag=0;
    T[x].tag+=z;
    T[x].v[1]+=z*z*(T[x].r-T[x].l+1)+2*T[x].v[0]*z;
    T[x].v[0]+=z*(T[x].r-T[x].l+1);
    T[y].tag+=z;
    T[y].v[1]+=z*z*(T[y].r-T[y].l+1)+2*T[y].v[0]*z;
    T[y].v[0]+=z*(T[y].r-T[y].l+1);
}
void make(int id,int l,int r){
    T[id].l=l; T[id].r=r;
    if(l==r){
        double x;
        scanf("%lf",&x);
        T[id].v[0]=x;
        T[id].v[1]=x*x;
        return;
    }
    int mid=l+r>>1;
    make(id*2  ,l,mid  );
    make(id*2+1,mid+1,r);
    up(id);
}
void add(int id,int x,int y,double z){
    push(id);
    if(x<=T[id].l&&T[id].r<=y){
        T[id].tag=z;
        T[id].v[1]+=z*z*(T[id].r-T[id].l+1)+2*T[id].v[0]*z;
        T[id].v[0]+=z*(T[id].r-T[id].l+1);
        return;
    }
    if(T[id*2  ].r>=x)add(id*2  ,x,y,z);
    if(T[id*2+1].l<=y)add(id*2+1,x,y,z);
    up(id);
}
double out(int id,int x,int y,int k){
    push(id);
    if(x<=T[id].l&&T[id].r<=y)return T[id].v[k];
    double ans=0;
    if(T[id*2  ].r>=x)ans+=out(id*2  ,x,y,k);
    if(T[id*2+1].l<=y)ans+=out(id*2+1,x,y,k);
    return ans;
}
int main()
{
    scanf("%d%d",&n,&m);
    make(1,1,n);
    while(m--){
        scanf("%d",&k);
        if(k==1)scanf("%d%d%lf",&x,&y,&z),add(1,x,y,z);
        if(k==2)scanf("%d%d",&x,&y),printf("%.4lf\n",out(1,x,y,0)/(y-x+1.));
        if(k==3){
            scanf("%d%d",&x,&y);
            double ba=out(1,x,y,0)/(y-x+1.);
            printf("%.4lf\n",out(1,x,y,1)/(y-x+1.)-ba*ba);
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你关于SPSS Modeler单因素方差分析的问题。以下是一个案例实践。 案例描述: 一家服装公司想知道不同性别的顾客对其新品牌服装的喜好度是否有显著差异。该公司在不同地区随机选取了100名男性和100名女性,并让他们对新品牌服装进行评分。现在,该公司想通过单因素方差分析来确定性别是否对评分产生影响。 实践步骤: 1. 打开SPSS Modeler软件,导入数据集。在“数据准备”节点中,选择“导入数据”并选择数据文件。在“数据文件选项”中选择“首行为变量名”。 2. 在“统计建模”节点中,选择“单因素方差分析”。将数据集连接到“单因素方差分析”节点中。 3. 在“单因素方差分析”节点中,选择因变量和自变量。在本案例中,因变量为评分,自变量为性别。将“性别”变量拖入“因子”框中,“评分”变量拖入“反应”框中。 4. 点击“运行”按钮,进行单因素方差分析。在结果窗口中,可以看到单因素方差分析的结果,包括F值、P值和效应大小等。 结果解释: 根据本案例的结果,F值为17.49,P值为0.0001。因为P值小于0.05,所以我们可以得出结论:性别对评分产生了显著影响。 总结: SPSS Modeler的单因素方差分析功能可以帮助我们确定不同自变量对因变量的影响程度,从而得出科学的结论。在进行单因素方差分析时,需要注意选择合适的因变量和自变量,并对结果进行科学解释。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值