我的代码懒标记类型为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;
}