40pts求调,悬赏3个关注
  • 板块P1471 方差
  • 楼主leiwusi
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/9/3 16:02
  • 上次更新2023/11/2 22:53:47
查看原帖
40pts求调,悬赏3个关注
525038
leiwusi楼主2023/9/3 16:02
#include<cstdio>
#include<iostream>
#define dd double
using namespace std;
const int MAXN = 1E5+114;


dd ls[MAXN*4];
dd lsq[MAXN*4];
dd laz[MAXN*4];

dd num[MAXN];

int n,m;


void pushup(int u){
    ls[u] = ls[u*2]+ls[u*2+1];
    lsq[u] = lsq[u*2]+lsq[u*2+1];
}

void pushdown(int u,int x){//x:length;u:place; 
    if(laz[u]){
        lsq[u*2]+=2*laz[u]*ls[u*2]+(x-x/2)*laz[u]*laz[u];
        lsq[u*2+1] += 2*laz[u]*ls[u*2+1]+(x/2)*laz[u]*laz[u];
        ls[u*2] += (x-x/2)*laz[u];
        ls[u*2+1] += (x/2)*laz[u];
        laz[u*2]+=laz[u];
        laz[u*2+1]+=laz[u];
        laz[u] = 0;
    }
}


void build(const int u,int l,int r){
    if(l==r){
        scanf("%lf",&ls[u]);
        lsq[u] = ls[u]*ls[u];
        return;
    }
    int m = (l+r)>>1;
    build(u*2,l,m);
    build(u*2+1,m+1,r);
    pushup(u);
}


// inline bool checkout(int L,int R,int l,int r){
//     return (L<r) || (R<l);
// }

dd get(int u,int L,int R,int l,int r){//l,r是被查询的
    if(L>=l && R<=r) return ls[u];
    pushdown(u,R-L+1);
    int m = (L+R)>>1;
    dd ret = 0;
    if(m>=l) ret += get(u*2,L,m,l,r);
    if(m<r) ret += get(u*2+1,m+1,R,l,r);
    return ret;
    // else return 0.0;
}

dd get_b(int u,int L,int R,int l,int r){//l,r是被查询的
    if(L>=l && R<=r) return lsq[u];
    pushdown(u,R-L+1);
    int m = (L+R)>>1;
    dd ret = 0;
    if(m>=l) ret += get(u*2,L,m,l,r);
    if(m<r) ret += get(u*2+1,m+1,R,l,r);
    return ret;
    // else return 0.0;
}





void addd(int u,int L,int R,int l,int r,dd x){//daxie bian
    if(L>=l && R<=r){
        laz[u] += x;
        lsq[u]+=2*x*ls[u]+x*x*(R-L+1);
        ls[u]+=(R-L+1)*x;
        // cout<<1919810<<endl;
        }
    else{
        pushdown(u,R-L+1);
        
        int m = (L+R)>>1;
        if(l<=m) addd(u*2,L,m,l,r,x);
        if(m<r) addd(u*2+1,m+1,R,l,r,x);
        pushup(u);
    }
}
//mark[rt]+=x,segb[rt]+=2*x*sega[rt]+x*x*(r-l+1),sega[rt]+=(r-l+1)*x;





int main(){
    scanf("%d %d",&n,&m);
    build(1,1,n);

    int a,b,c;
    double d=0;
    while(m--){
        scanf("%d",&a);
        
        if(a == 1){
            scanf("%d %d",&b,&c);
            cin>>d;
            addd(1,1,n,b,c,d);
        }
        if(a==2){
            scanf("%d %d",&b,&c);
            printf("%.4lf\n",get(1,1,n,b,c)*1.0/(c-b+1.0));
        }
        if(a==3){
            //方差
            scanf("%d %d",&b,&c);
            
            dd sum1=get_b(1,1,n,b,c)*1.0/(c-b+1.0),sum2=get(1,1,n,b,c)*1.0/(c-b+1.0);
            dd afjkf = sum1-sum2*sum2;
            printf("%.4lf\n",afjkf);

        }
        // cout<<1145141919810<<endl;
    }
    return 0;
}
2023/9/3 16:02
加载中...