关于懒标记与nan
查看原帖
关于懒标记与nan
1062499
粥2414楼主2025/1/16 18:02

我的代码懒标记类型为ll时可以正常ac,但把懒标记类型改为long double 时却会输出nan,并且0分,感觉很奇怪,恳请大佬解答

#include<bits/stdc++.h>
#define ll long long
#define dd long double
#define lson (id*2)
#define rson (id*2+1)
#define mid ((l+r)/2)
#define px (ans.xsum3/len)
#define py (ans.ysum3/len)
using namespace std;
inline ll read(){
	ll x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
void write(ll x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9){
		write(x/10);
	}
	putchar(x%10+'0');
}
const ll N=1e5+9;
ll n,m;
struct TREE{
	dd len;
	dd sum1,sum2;//i i^2
	dd xsum3,xsum4,ysum3;//xi xi^2 yi
	dd xysum;//x*y
}tr[N*4];
dd lazy2[N*4][2],lazy3[N*4][2];//0:x 1:y
ll x[N],y[N];
void pu(ll id){
	tr[id].xsum3 =tr[lson].xsum3 +tr[rson].xsum3 ;
	tr[id].xsum4 =tr[lson].xsum4 +tr[rson].xsum4 ;
	tr[id].xysum =tr[lson].xysum +tr[rson].xysum ;
	tr[id].ysum3 =tr[lson].ysum3 +tr[rson].ysum3 ;
}
void pd(ll id){
	if(lazy3[id][0]!=-1.0){
		dd S=lazy3[id][0],T=lazy3[id][1];
		tr[lson].xsum3 =tr[lson].len *S+tr[lson].sum1 ;
		tr[lson].ysum3 =tr[lson].len *T+tr[lson].sum1 ;
		tr[lson].xsum4 =tr[lson].len *S*S+2*S*tr[lson].sum1 +tr[lson].sum2 ;
		tr[lson].xysum =tr[lson].len *S*T+S*tr[lson].sum1 +T*tr[lson].sum1 +tr[lson].sum2 ;
		lazy3[lson][0]=S;lazy3[lson][1]=T;
		lazy2[lson][0]=0;lazy2[lson][1]=0;
		
		tr[rson].xsum3 =tr[rson].len *S+tr[rson].sum1 ;
		tr[rson].ysum3 =tr[rson].len *T+tr[rson].sum1 ;
		tr[rson].xsum4 =tr[rson].len *S*S+2*S*tr[rson].sum1 +tr[rson].sum2 ;
		tr[rson].xysum =tr[rson].len *S*T+S*tr[rson].sum1 +T*tr[rson].sum1 +tr[rson].sum2 ;
		lazy3[rson][0]=S;lazy3[rson][1]=T;
		lazy2[rson][0]=0;lazy2[rson][1]=0;
		
		lazy3[id][0]=-1.0;lazy3[id][1]=-1.0;
	}
	if(lazy2[id][0]!=0.0||lazy2[id][1]!=0.0){
		dd S=lazy2[id][0],T=lazy2[id][1];
		tr[lson].xsum4+=2*S*tr[lson].xsum3+tr[lson].len*S*S;
		tr[lson].xysum+=T*tr[lson].xsum3+S*tr[lson].ysum3+tr[lson].len*S*T;
		tr[lson].xsum3+=tr[lson].len*S;
		tr[lson].ysum3+=tr[lson].len*T;
		lazy2[lson][0]+=S;lazy2[lson][1]+=T;
		
		tr[rson].xsum4+=2*S*tr[rson].xsum3+tr[rson].len*S*S;
		tr[rson].xysum+=T*tr[rson].xsum3+S*tr[rson].ysum3+tr[rson].len*S*T;
		tr[rson].xsum3+=tr[rson].len*S;
		tr[rson].ysum3+=tr[rson].len*T;
		lazy2[rson][0]+=S;lazy2[rson][1]+=T;
		
		lazy2[id][0]=0.0;lazy2[id][1]=0.0;
	}
}
void build(ll id,ll l,ll r){
	tr[id].len=r-l+1;
	if(l==r){
		tr[id].sum1=l;
		tr[id].sum2=l*l;
		tr[id].xsum3=x[l];
		tr[id].xsum4=x[l]*x[l];
		tr[id].ysum3=y[l];
		tr[id].xysum=x[l]*y[l];
		return;
	}
	build(lson,l,mid);
	build(rson,mid+1,r);
	pu(id);
	tr[id].sum1=tr[lson].sum1+tr[rson].sum1;
	tr[id].sum2=tr[lson].sum2+tr[rson].sum2;
	return;
}
void init(){
	memset(lazy3,-1,sizeof(lazy3));
	build(1,1,n);
}
void add(ll id,ll l,ll r,ll ql,ll qr,dd S,dd T){//操作二
	if(l!=r){
		pd(id);
	}
	if(ql<=l&&r<=qr){
		tr[id].xsum4+=2*S*tr[id].xsum3+tr[id].len*S*S;
		tr[id].xysum+=T*tr[id].xsum3+S*tr[id].ysum3+tr[id].len*S*T;
		tr[id].xsum3+=tr[id].len*S;
		tr[id].ysum3+=tr[id].len*T;
		lazy2[id][0]+=S;lazy2[id][1]+=T;
		return;
	}
	if(ql<=mid){
		add(lson,l,mid,ql,qr,S,T);
	}
	if(qr>mid){
		add(rson,mid+1,r,ql,qr,S,T);
	}
	pu(id);
	return;
}
void change(ll id,ll l,ll r,ll ql,ll qr,dd S,dd T){//操作三
	if(l!=r){
		pd(id);
	}
	if(ql<=l&&r<=qr){
		tr[id].xsum3 =tr[id].len *S+tr[id].sum1 ;
		tr[id].ysum3 =tr[id].len *T+tr[id].sum1 ;
		tr[id].xsum4 =tr[id].len *S*S+2*S*tr[id].sum1 +tr[id].sum2 ;
		tr[id].xysum =tr[id].len *S*T+S*tr[id].sum1 +T*tr[id].sum1 +tr[id].sum2 ;
		lazy3[id][0]=S;lazy3[id][1]=T;
		lazy2[id][0]=0;lazy2[id][1]=0;
		return;
	}
	if(ql<=mid){
		change(lson,l,mid,ql,qr,S,T);
	}
	if(qr>mid){
		change(rson,mid+1,r,ql,qr,S,T);
	}
	pu(id);
	return;
}
TREE qu(ll id,ll l,ll r,ll ql,ll qr){
	if(l!=r){
		pd(id);
	}
	if(ql<=l&&r<=qr){
		return tr[id];
	}
	TREE L={0},R={0};
	if(ql<=mid){
		L=qu(lson,l,mid,ql,qr);
	}
	if(qr>mid){
		R=qu(rson,mid+1,r,ql,qr);
	}
	L.sum1+=R.sum1;
	L.sum2+=R.sum2;
	L.xsum3+=R.xsum3;
	L.xsum4+=R.xsum4;
	L.ysum3+=R.ysum3;
	L.xysum+=R.xysum;
	return L;
}
void print(TREE ans,ll l,ll r){
	dd len =r-l+1;
	dd zi=ans.xysum-py*ans.xsum3-px*ans.ysum3+len*px*py;
	dd mu=ans.xsum4-2*px*ans.xsum3+len*px*px;
//	cout<<ans.sum1<<' '<<ans.sum2<<' '<<ans.xsum3<<' '<<ans.xsum4<<' '<<ans.ysum3<<' '<<ans.xysum<<endl;
	printf("%.63Lf",zi/mu);
	putchar('\n');
}
int main(){
	n=read();
	m=read();
	for(int i=1;i<=n;i++){
		x[i]=read();
	}
	for(int i=1;i<=n;i++){
		y[i]=read();
	}
	init();
	for(int i=1;i<=m;i++){
		ll op=read(),l=read(),r=read();
		if(op==1){
			print(qu(1,1,n,l,r),l,r);
		}
		if(op==2){
			dd s,t;
			scanf("%Lf%Lf",&s,&t);
			add(1,1,n,l,r,s,t);
		}
		if(op==3){
			dd s,t;
			scanf("%Lf%Lf",&s,&t);
			change(1,1,n,l,r,s,t);
		}
	}
	return 0;
}
2025/1/16 18:02
加载中...