锰锌妹子@Blikewsr求调
查看原帖
锰锌妹子@Blikewsr求调
575066
ALL_FallsDown楼主2024/10/5 12:31
#include<bits/stdc++.h>
using namespace std;
int n,m,a[100005],f[1000005];
struct node{    
    double num,sum,x,y,psum;
}tree[1000005];
void build(int x,int y,int p){
    if(x==y){
        tree[p].num=a[x]*1.0;
        tree[p].sum=a[x]*a[x]*1.0;
        tree[p].psum=a[x]*1.0;
        tree[p].x=x;
        tree[p].y=y;
        return ;
    }
    int mid=(x+y)/2;
    build(x,mid,p*2);
    build(mid+1,y,p*2+1);
    tree[p].num=tree[p*2].num+tree[p*2+1].num;
    tree[p].sum=tree[p*2].sum+tree[p*2+1].sum;
}
void down(int x,int y,int p){
    tree[p*2].num+=(tree[p*2].y-tree[p*2].x+1)*f[p];
    tree[p*2+1].num+=(tree[p*2+1].y-tree[p*2+1].x+1)*f[p];
    tree[p*2].psum+=f[p];
    tree[p*2+1].psum+=f[p];
    if(f[p]>0) tree[p*2].sum+=((tree[p*2].y-tree[p*2].x+1)*(f[p]*f[p])+f[p]*2*tree[p*2].num);
    if(f[p]>0) tree[p*2+1].sum+=((tree[p*2+1].y-tree[p*2+1].x+1)*(f[p]*f[p])+f[p]*2*tree[p*2+1].num);
    if(f[p]<0) tree[p*2].sum+=((tree[p*2].y-tree[p*2].x+1)*(f[p]*f[p])-f[p]*2*tree[p*2].num);
    if(f[p]<0) tree[p*2+1].sum+=((tree[p*2+1].y-tree[p*2+1].x+1)*(f[p]*f[p])-f[p]*2*tree[p*2+1].num);
    f[p*2]+=f[p];
    f[p*2+1]+=f[p];
    f[p]=0;
}
void add(int x,int y,int s,int t,int w,int p){
    if(x>=s&&y<=t){
        tree[p].sum+=((tree[p].y-tree[p].x+1)*(f[p]*f[p])+2*f[p]*tree[p].num);
        tree[p].num+=(x-y+1)*w*1.0;
        tree[p].psum+=w*1.0;
        f[p]+=w*1.0;
        return ;
    }
    int mid=(x+y)/2;
    down(x,y,p);
    if(mid>=s) add(x,mid,s,t,w,p*2);
    if(mid<t) add(mid+1,y,s,t,w,p*2+1);
    tree[p].num=tree[p*2].num+tree[p*2+1].num;
    tree[p].sum=tree[p*2].sum+tree[p*2+1].sum;
}
double find(int x,int y,int s,int t,int p){
    if(x>=s&&y<=t){
        return tree[p].num;
    }
    double mid=(x+y)/2,sum=0;
    down(x,y,p);
    if(mid>=s) sum=find(x,mid,s,t,p*2);
    if(mid<t) sum+=find(mid+1,y,s,t,p*2+1);
    return sum;
}
double findd(int x,int y,int s,int t,int p){
    if(x>=s&&y<=t){
        return tree[p].sum;
    }
    double mid=(x+y)/2,ssum=0;
    down(x,y,p);
    if(mid>=s) ssum=findd(x,mid,s,t,p*2);
    if(mid<t) ssum+=findd(mid+1,y,s,t,p*2+1);
    return ssum;
}
signed main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,n,1);
    for(int i=1;i<=m;i++){
        int x,y,op;
        cin>>op;
        if(op==1){
            int x,y,k;
            cin>>x>>y>>k;
            add(1,n,x,y,k,1);
        }
        if(op==2){
            int x,y;
            cin>>x>>y;
            cout<<find(1,n,x,y,1)*1.0/(y-x+1)<<endl;
        }
        if(op==3){
            int x,y;
            cin>>x>>y;
            cout<<(findd(1,n,x,y,1)-(2*find(1,n,x,y,1)*1.0/(y-x+1)*find(1,n,x,y,1))+(y-x+1)*find(1,n,x,y,1)*1.0/(y-x+1)*find(1,n,x,y,1)*1.0/(y-x+1))*1.0/(y-x+1)<<endl;
        }
    }
	return 0;
}
2024/10/5 12:31
加载中...