萌新分块求助
查看原帖
萌新分块求助
674247
seanlsy楼主2022/8/15 17:35

WA on #3~7

#include <bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
	int x=0;bool f=1;char ch=getchar();
	for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') f=0;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
	return f?x:-x;
}
int n,m,l,r,s,t,block,bl[100005],opt,x[100005],y[100005],ad[505],da[505],sx[505],sy[505],sxq[505],sxy[505];
inline long double query(int l,int r){
	int sumx=0,sumy=0;
	long double _x,_y,fz=0,fm=0;
	for(int i=l;i<=min(r,bl[l]*block);i++)
		sumx+=(x[i]+ad[bl[i]]),sumy+=(y[i]+da[bl[i]]),
		fz+=(x[i]+ad[bl[i]])*(y[i]+da[bl[i]]),fm+=(x[i]+ad[bl[i]])*(x[i]+ad[bl[i]]);
	if(bl[l]^bl[r])
		for(int i=(bl[r]-1)*block+1;i<=r;i++)
			sumx+=(x[i]+ad[bl[i]]),sumy+=(y[i]+da[bl[i]]),
			fz+=(x[i]+ad[bl[i]])*(y[i]+da[bl[i]]),fm+=(x[i]+ad[bl[i]])*(x[i]+ad[bl[i]]);
	for(int i=bl[l]+1;i<bl[r];i++)
		sumx+=sx[i],sumy+=sy[i],fz+=sxy[i],fm+=sxq[i];
	_x=1.0*sumx/(r-l+1),_y=1.0*sumy/(r-l+1);
	fz=fz+(r-l+1)*_x*_y-sumy*_x-sumx*_y,fm=fm+(r-l+1)*_x*_x-2*sumx*_x;
	return fz/fm;
}
inline void Add(int l,int r,int s,int t){
	for(int i=l;i<=min(r,bl[l]*block);i++)
		sx[bl[l]]+=s,sxq[bl[l]]+=s*s+2*(x[i]+ad[bl[i]])*s,sxy[bl[l]]+=s*(y[i]+da[bl[i]]),x[i]+=s,
		sy[bl[l]]+=t,sxy[bl[l]]+=t*(x[i]+ad[bl[i]]),y[i]+=t;
	if(bl[l]^bl[r])
		for(int i=(bl[r]-1)*block+1;i<=r;i++)
			sx[bl[r]]+=s,sxq[bl[r]]+=s*s+2*(x[i]+ad[bl[i]])*s,sxy[bl[r]]+=s*(y[i]+da[bl[i]]),x[i]+=s,
			sy[bl[r]]+=t,sxy[bl[r]]+=t*(x[i]+ad[bl[i]]),y[i]+=t;
	for(int i=bl[l]+1;i<bl[r];i++)
		sxq[i]+=s*s*block+2*s*sx[i],sx[i]+=s*block,sxy[i]+=s*sy[i],
		sy[i]+=t*block,sxy[i]+=t*sx[i],da[i]+=t,ad[i]+=s;
}
inline void b(int l,int r,int s,int t){
	for(int i=l;i<=min(bl[l]*block,r);i++)
		sx[bl[i]]-=x[i],sxq[bl[i]]-=x[i]*x[i],sxy[bl[i]]-=x[i]*y[i],ad[bl[i]]=da[bl[i]]=0,
		x[i]=s+i,sx[bl[i]]+=x[i],sxq[bl[i]]+=x[i]*x[i],sxy[bl[i]]+=x[i]*y[i],
		sy[bl[i]]-=y[i],sxy[bl[i]]-=x[i]*y[i],y[i]=i+t,sy[bl[i]]+=y[i],sxy[bl[i]]+=x[i]*y[i];
	if(bl[l]^bl[r])
		for(int i=(bl[r]-1)*block+1;i<=r;i++)
			sx[bl[i]]-=x[i],sxq[bl[i]]-=x[i]*x[i],sxy[bl[i]]-=x[i]*y[i],ad[bl[i]]=da[bl[i]]=0,
			x[i]=s+i,sx[bl[i]]+=x[i],sxq[bl[i]]+=x[i]*x[i],sxy[bl[i]]+=x[i]*y[i],
			sy[bl[i]]-=y[i],sxy[bl[i]]-=x[i]*y[i],y[i]=i+t,sy[bl[i]]+=y[i],sxy[bl[i]]+=x[i]*y[i];
	for(int i=bl[l]+1;i<bl[r];i++){
		int lt=((i-1)*block+1),rt=i*block;
		sxy[i]=(rt-lt+1)*s*t+(s+t)*(lt+rt)*(lt+rt-1)/2+rt*(rt+1)*(2*rt+1)/6-lt*(lt-1)*(2*lt-1)/6,
		sxq[i]=(rt-lt+1)*s*s+s*(lt+rt)*(rt-lt+1)+rt*(rt+1)*(2*rt+1)/6-lt*(lt-1)*(2*lt-1)/6,
		sx[i]=(rt-lt+1)*s+(lt+rt)*(rt-lt+1)/2,sy[i]=(rt-lt+1)*t+(lt+rt)*(rt-lt+1)/2;
		ad[i]=da[i]=0;
	}
} 
signed main(){
//	freopen("analyze.in","r",stdin);
//	freopen("analyze.out","w",stdout);
	n=read(),m=read(),block=sqrt(n);
	for(int i=1;i<=n;i++)
		x[i]=read(),bl[i]=(i-1)/block+1,sx[bl[i]]+=x[i],sxq[bl[i]]+=x[i]*x[i];
	for(int i=1;i<=n;i++)
		y[i]=read(),sy[bl[i]]+=y[i],sxy[bl[i]]+=x[i]*y[i];
//	for(int i=1;(i-1)*block<n;i++)
//		printf("%lld %lld %lld %lld\n",sx[i],sy[i],sxq[i],sxy[i]);
	while(m--){
		opt=read(),l=read(),r=read();
		if(opt==1) cout<<fixed<<setprecision(10)<<query(l,r)<<'\n';
		else{
			s=read(),t=read();
			if(opt&1) b(l,r,s,t);
			else Add(l,r,s,t);
		}
	}
	return 0;
}
2022/8/15 17:35
加载中...