输出nan求助!@!#$#!@!
  • 板块P1471 方差
  • 楼主STUDENT00
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/10/31 17:35
  • 上次更新2023/10/27 04:42:58
查看原帖
输出nan求助!@!#$#!@!
658786
STUDENT00楼主2022/10/31 17:35
#include<bits/stdc++.h>
using namespace std;
int n,m;
double sum1[400010],sum2[400010],add[400010];
void push_up(int rt){
    sum1[rt]=sum1[rt<<1]+sum1[rt<<1|1];
    sum2[rt]=sum2[rt<<1]+sum2[rt<<1|1];
}
void build(int l,int r,int rt){
    if(l==r){
        scanf("%lf",&sum1[rt]);
        sum2[rt]=sum1[rt];
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,rt<<1);
    build(mid+1,r,rt<<1|1);
    push_up(rt);
}
void push_down(int rt,int m){
    if(add[rt]){
        add[rt<<1]+=add[rt];
        add[rt<<1|1]+=add[rt];
        sum2[rt<<1]+=add[rt]*add[rt]*(m-(m>>1))+2*add[rt]*sum1[rt];
        sum1[rt<<1|1]+=add[rt]*(m-(m>>1));
        sum2[rt<<1]+=add[rt]*add[rt]*(m>>1)+2*add[rt]*sum1[rt];
        sum1[rt<<1|1]+=add[rt]*(m>>1);
        add[rt]=0;
    }
}
void update(int l,int r,int rt,int a,int b,double c){
    if(a<=l&&b>=r){
        add[rt]+=c;
        sum2[rt]+=c*c*(r-l+1)+2*c*sum1[rt];
        sum1[rt]+=(r-l+1)*c;
        return;
    }
    push_down(rt,r-l+1);
    int mid=(l+r)>>1;
    if(a<=mid) update(l,mid,rt<<1,a,b,c);
    if(b>mid) update(mid+1,r,rt<<1|1,a,b,c);
    push_up(rt);
}
double query1(int l,int r,int rt,int a,int b){
    if(a<=l&&b>=r) return sum1[rt];
    push_down(rt,r-l+1);
    int mid=(l+r)>>1;
    double ans=0;
    if(a<=mid) ans+=query1(l,mid,rt<<1,a,b);
    if(b>mid) ans+=query1(mid+1,r,rt<<1|1,a,b);
    return ans;
}
double query2(int l,int r,int rt,int a,int b){
    if(a<=l&&b>=r) return sum2[rt];
    push_down(rt,r-l+1);
    int mid=(l+r)>>1;
    double ans=0;
    if(a<=mid) ans+=query2(l,mid,rt<<1,a,b);
    if(b>mid) ans+=query2(mid+1,r,rt<<1|1,a,b);
    return ans;
}
int main(){
    scanf("%d%d",&n,&m);
    build(1,n,1);
    while(m--){
        int op;
        scanf("%d",&op);
        if(op==1){
            int x,y;
            double k;
            scanf("%d%d%lf",&x,&y,&k);
            update(1,n,1,x,y,k);
        }else if(op==2){
            int x,y;
            scanf("%d%d",&x,&y);
            printf("%.4lf\n",query1(1,n,1,x,y)/(y-x+1));
        }else{
            int x,y;
            scanf("%d%d",&x,&y);
            double s=query1(1,n,1,x,y),p=(y-x+1);
            printf("%.4lf\n",sqrt((query2(1,n,1,x,y)-2*s*p+p*p*(y-x+1))/(y-x+1)));
        }
    }
    return 0;
}
2022/10/31 17:35
加载中...