码风良好 可爱 线段树40pts求调
  • 板块P1471 方差
  • 楼主saixingzhe
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/4/6 14:00
  • 上次更新2024/4/6 15:34:07
查看原帖
码风良好 可爱 线段树40pts求调
652816
saixingzhe楼主2024/4/6 14:00
#include<bits/stdc++.h>
using namespace std;
int n,m,op,x,y;
double a[100001],k;
struct Node{
	int l,r,sz;
	double sum,qsum,lazy;
}s[400001];
void pushup(int rt){
	s[rt].sum=s[rt<<1].sum+s[rt<<1|1].sum;
	s[rt].qsum=s[rt<<1].qsum+s[rt<<1|1].qsum;
}
void f(int rt,double k){
	s[rt].qsum+=2.0*k*s[rt].sum+k*k*s[rt].sz;
	s[rt].sum+=k*s[rt].sz;
	s[rt].lazy+=k;
}
void pushdown(int rt){
	if(s[rt].lazy!=0){
		f(rt<<1,s[rt].lazy);
		f(rt<<1|1,s[rt].lazy);
		s[rt].lazy=0;
	}
}
void make(int l,int r,int rt){
	s[rt]={l,r,r-l+1,0,0,0};
	if(l==r){
		s[rt].qsum=a[l]*a[l];
		s[rt].sum=a[l];
		return ;
	}
	int mid=l+r>>1;
	make(l,mid,rt<<1);
	make(mid+1,r,rt<<1|1);
	pushup(rt);
}
void update(int l,int r,int rt,double k){
	if(l<=s[rt].l&&s[rt].r<=r){
		f(rt,k);
		return ;
	}
	pushdown(rt);
	int mid=s[rt].l+s[rt].r>>1;
	if(l<=mid)	update(l,r,rt<<1,k);
	if(r>mid)	update(l,r,rt<<1|1,k);
	pushup(rt);
}
double query(int l,int r,int rt){
	double ans=0;
	if(l>s[rt].r||s[rt].l>r)	return 0;
	if(l<=s[rt].l&&s[rt].r<=r)	return s[rt].sum;
	int mid=s[rt].l+s[rt].r>>1;
	pushdown(rt);
	if(l<=mid)	ans+=query(l,r,rt<<1);
	if(r>mid)	ans+=query(l,r,rt<<1|1);
	return ans;
}
double qquery(int l,int r,int rt){
	double ans=0;
	if(l>s[rt].r||s[rt].l>r)	return 0;
	if(l<=s[rt].l&&s[rt].r<=r)	return s[rt].qsum;
	int mid=s[rt].l+s[rt].r>>1;
	pushdown(rt);
	if(l<=mid)	ans+=query(l,r,rt<<1);
	if(r>mid)	ans+=query(l,r,rt<<1|1);
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)	scanf("%lf",&a[i]);
	make(1,n,1);
	for(int i=1;i<=m;i++){
        scanf("%d%d%d",&op,&x,&y);
        if(op==1){
        	scanf("%lf",&k);
            update(x,y,1,k);
        }
        else if(op==2)	printf("%.4f\n",query(x,y,1)/(y-x+1));
        else	printf("%.4f\n",qquery(x,y,1)/(y-x+1)-query(x,y,1)/(y-x+1)*query(x,y,1)/(y-x+1));
    }
	return 0;
}

在此附上错误样例

8 15
8.46 6.03 3.73 0.32 7.43 3.71 8.04 8.22 
3 1 8
1 2 8 -2.7566713364794850E+0000
1 2 8  2.1308819339610636E+0000
1 1 6  1.5912831262685359E+0000
1 1 8 -2.7779214559122920E+0000
1 1 8 -6.5134523715823889E-0001
3 2 8
1 1 6 -8.5440817382186651E-0001
3 2 8
2 2 8
3 2 7
1 3 8 -1.8737916438840330E+0000
1 1 7  2.5193137815222144E+0000
1 3 8  1.2835426828823984E+0000
3 3 8
7.4145
5.2609
6.2101
1.8256
6.1810
5.8854

我的输出:

7.4145
-3.4976
-1.5071
1.8256
-0.6255
-6.9702
2024/4/6 14:00
加载中...