RE求条 (玄关)
  • 板块P1471 方差
  • 楼主S08578
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/1/13 17:03
  • 上次更新2025/1/13 21:10:35
查看原帖
RE求条 (玄关)
679907
S08578楼主2025/1/13 17:03
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<set>


using namespace std;

#define int long long
#define ll long long
#define Endl cout<<endl;
#define ENdl Endl
#define xy cout<<"xy";
#define yx cout<<"yx";
#define pii pair<int,int>
#define lowbit(x) x&(-x)
#define fi first
#define se second
#define fst ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

const int N=2e5+10;//注意修改
const int mod=1e9+7;
const int Max=0x3f3f3f3f3f;

#define db double

struct tree{
    int l,r;
    int add;
    int sum;
}tr[N<<2],ftr[N<<2];
int a[N];
int n,m;

void pushup(int rt){
    tr[rt].sum=(tr[rt<<1].sum+tr[rt<<1|1].sum);
    ftr[rt].sum=(ftr[rt<<1].sum+ftr[rt<<1|1].sum);
}

void build(int rt,int l,int r){
    tr[rt].l=l;
    tr[rt].r=r;
    ftr[rt].l=l;
    ftr[rt].r=r;
    ftr[rt].add=0;
    tr[rt].add=0;
    if(l==r){
        tr[rt].sum=a[l];
        ftr[rt].sum=a[l]*a[l];
    }
    int mid=(l+r)>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    pushup(rt);
}



void pushdown(int rt){
    if(tr[rt].add!=0){
        tr[rt<<1].add+=tr[rt].add;
        tr[rt<<1].sum+=tr[rt].add*(tr[rt<<1].r-tr[rt<<1].l+1);
        tr[rt<<1|1].add+=tr[rt].add;
        tr[rt<<1|1].sum+=tr[rt].add*(tr[rt<<1|1].r-tr[rt<<1|1].l+1);
        tr[rt].add=0;
    }
    if(ftr[rt].add!=0){
        ftr[rt<<1].add+=ftr[rt].add;
        ftr[rt<<1].sum+=(ftr[rt<<1].r-ftr[rt<<1].l+1)*(ftr[rt].add*ftr[rt].add)+tr[rt].sum*2*(ftr[rt].add);
        ftr[rt<<1|1].add+=ftr[rt].add;
        ftr[rt<<1|1].sum+=(ftr[rt<<1|1].r-ftr[rt<<1|1].l+1)*(ftr[rt].add*ftr[rt].add)+tr[rt].sum*2*(ftr[rt].add);
        ftr[rt].add=0;
    }
    
}

void add(int rt,int l,int r,int k){
    if(tr[rt].l>=l&&tr[rt].r<=r){
        tr[rt].add+=k;
        tr[rt].sum+=k*(tr[rt].r-tr[rt].l+1);
        ftr[rt].add+=k;
        ftr[rt].sum+=tr[rt].sum*2*k+(tr[rt].r-tr[rt].l+1)*k*k;
    }
    //pushdown(rt);
    int mid=(tr[rt].l+tr[rt].r)>>1;
    if(l<=mid) add(rt<<1,l,r,k);
    if(r>mid) add(rt<<1|1,l,r,k);
    pushup(rt);
}

int query1(int rt,int l,int r){
    if(tr[rt].l>=l&&tr[rt].r<=r){
        return tr[rt].sum;
    }
    if(tr[rt].l==tr[rt].r) return 0;
    //pushdown(rt);
    int mid=(tr[rt].l+tr[rt].r)>>1;
    int res=0;
    if(l<=mid) res+=query1(rt<<1,l,r);
    if(r>mid) res+=query1(rt<<1|1,l,r);
    return res;
}

int query2(int rt,int l,int r){
    if(ftr[rt].l>=l&&ftr[rt].r<=r){
        return tr[rt].sum;
    }
    if(ftr[rt].l==ftr[rt].r) return 0;
    pushdown(rt);
    int mid=(ftr[rt].l+ftr[rt].r)>>1;
    int res=0;
    if(l<=mid) res+=query2(rt<<1,l,r);
    if(r>mid) res+=query2(rt<<1|1,l,r);
    return res;
}

/*
 */
signed main(){
    
//   freopen("a.in","r",stdin);
//   freopen("a.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int op;
        int x,y,k;
        cin>>op;
        if(op==1){
            cin>>x>>y>>k;
            add(1,x,y,k);
        }
        if(op==2){
            cin>>x>>y;
            cout<<fixed<<setprecision(4)<<1.0*query1(1,x,y)/(y-x+1)<<endl;
        }
        if(op==3){
            cin>>x>>y;
            cout<<fixed<<setprecision(4)<<1.0*query2(1,x,y)/(y-x+1)<<endl;
        }
    }
    return 0;
}



/*
 1
 5 3
 2 4 5

 */

2025/1/13 17:03
加载中...