蒟蒻求调分块
  • 板块P1471 方差
  • 楼主seanlsy
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/3/13 14:01
  • 上次更新2023/10/23 21:41:09
查看原帖
蒟蒻求调分块
674247
seanlsy楼主2023/3/13 14:01

rt,全 WA

#include <bits/stdc++.h>
using namespace std;
int n,m,l,r,opt,bl[100005],block;
long double x,a[100005],s[355],s2[355],tag[355];
inline void Add(int l,int r,int x){
	for(int i=l;i<=min(r,bl[l]*block);i++)
		s2[bl[i]]+=2*(a[i]+tag[bl[i]])*x+x*x,a[i]+=x,s[bl[i]]+=x;
	if(bl[l]^bl[r])
		for(int i=(bl[r]-1)*block+1;i<=r;i++)
			s2[bl[i]]+=2*(a[i]+tag[bl[i]])*x+x*x,a[i]+=x,s[bl[i]]+=x;
	for(int i=bl[l]+1;i<bl[r];i++) s2[i]+=block*x*x+2*s[i]*x,s[i]+=block*x,tag[i]+=x;
}
inline long double sum(int l,int r){
	long double res=0;
	for(int i=l;i<=min(bl[l]*block,r);i++)
		res+=a[i]+tag[bl[i]];
	if(bl[l]^bl[r])
		for(int i=(bl[r]-1)*block+1;i<=r;i++)
			res+=a[i]+tag[bl[i]];
	for(int i=bl[l]+1;i<bl[r];i++)
		res+=s[i];
	return res;
}
inline long double sum2(int l,int r){
	long double res=0;
	for(int i=l;i<=min(bl[l]*block,r);i++)
		res=res+(a[i]+tag[bl[i]])*(a[i]+tag[bl[i]]);
	if(bl[l]^bl[r])
		for(int i=(bl[r]-1)*block+1;i<=r;i++)
			res=res+(a[i]+tag[bl[i]])*(a[i]+tag[bl[i]]);
	for(int i=bl[l]+1;i<bl[r];i++)
		res+=s2[i];
	return res;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m,block=sqrt(n);
	for(int i=1;i<=n;i++) cin>>a[i],bl[i]=(i-1)/block+1,s[bl[i]]+=a[i],s2[bl[i]]+=a[i]*a[i];
	while(m--){
		cin>>opt>>l>>r;
		if(opt==1){
			cin>>x;
			Add(l,r,x);
		}
		else if(opt==2) cout<<fixed<<setprecision(4)<<sum(l,r)/(r-l+1)<<'\n';
		else cout<<fixed<<setprecision(4)<<(sum(l,r)/(r-l+1))*(sum(l,r)/
		(r-l+1))+(sum2(l,r)-2*sum(l,r)*sum(l,r)/(r-l+1))/(r-l+1)<<'\n';
	}
	return 0;
}
2023/3/13 14:01
加载中...