求助,不知道哪里错了
  • 板块P1471 方差
  • 楼主no_love
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/2 21:00
  • 上次更新2024/3/2 22:28:04
查看原帖
求助,不知道哪里错了
1130801
no_love楼主2024/3/2 21:00
#include<bits/stdc++.h>
using namespace std;
#define N 100002
int n,m;
double mk[N*4];
struct node{double sum,square;}s[N*4];
void build(int a,int b,int d){
	if(a==b){
		cin>>s[d].sum;
		s[d].square=s[d].sum*s[d].sum;return;}
	build(a,a+(b-a)/2,d*2);
	build(a+(b-a)/2+1,b,d*2+1);
	s[d].sum=s[d*2].sum+s[d*2+1].sum;
	s[d].square=s[d*2].square+s[d*2+1].square;
}
void redact(int x,int y,double k,int d,int l,int r){
	if(y<l||x>r)return;
	if(l>=x&&r<=y){
		s[d].square+=(r-l+1)*k*k+2*k*s[d].sum;
		s[d].sum+=k*(r-l+1);
		if(l<r)mk[d]+=k;
		return;}
	redact(x,y,k,d*2,l,l+(r-l)/2);
	redact(x,y,k,d*2+1,l+(r-l)/2+1,r);
	s[d].sum=s[d*2].sum+s[d*2+1].sum;
	s[d].square=s[d*2].square+s[d*2+1].square;
}
void gu(int d,double k,int l,int r){
	s[d].square+=(r-l+1)*k*k+2*k*s[d].sum;
	s[d].sum+=k*(r-l+1);
	if(l<r)mk[d]+=k;
}
double find1(int x,int y,int d,int l,int r){
	if(mk[d]!=0){
		gu(d*2,mk[d],l,l+(r-l)/2);
		gu(d*2+1,mk[d],l+(r-l)/2+1,r);
		mk[d]=0;}
	if(y<l||x>r)return 0;
	if(l>=x&&r<=y)return s[d].sum;
	return find1(x,y,d*2,l,l+(r-l)/2)+find1(x,y,d*2+1,l+(r-l)/2+1,r);
}
double find2(int x,int y,int d,int l,int r){
	if(mk[d]!=0){
		gu(d*2,mk[d],l,l+(r-l)/2);
		gu(d*2+1,mk[d],l+(r-l)/2+1,r);
		mk[d]=0;}
	if(y<l||x>r)return 0;
	if(l>=x&&r<=y)return s[d].square;
	return find2(x,y,d*2,l,l+(r-l)/2)+find2(x,y,d*2+1,l+(r-l)/2+1,r);
}
int main(){
    cin>>n>>m;
    build(1,n,1);
    while(m--){
    	int o;cin>>o;
    	if(o==1){
    		int x,y;double k;cin>>x>>y;cin>>k;
    		redact(x,y,k,1,1,n);
		}else if(o==2){
			int x,y;cin>>x>>y;
			double v=find1(x,y,1,1,n)/(y-x+1);
			printf("%.4f\n",v);
		}else{
			int x,y;cin>>x>>y;
			double v=find1(x,y,1,1,n)/(y-x+1),v2=find2(x,y,1,1,n)/(y-x+1);
			printf("%.4f\n",v2-v*v);
		}
	}
    return 0;
}
2024/3/2 21:00
加载中...