求助这道题变量类型
  • 板块P1471 方差
  • 楼主hbhz_zcy
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/7/12 17:49
  • 上次更新2023/11/4 14:59:48
查看原帖
求助这道题变量类型
142549
hbhz_zcy楼主2021/7/12 17:49

为了保险我用的是longdouble,但交上全WA
code

#include<iostream>
#include<cstdio>
#define LLF long double
using namespace std;
const int maxn=1e5+10;
int n,m;LLF a[maxn];
struct node{int l,r;LLF v,v2,lazy;}f[4*maxn];
void ts(){
	for(int i=1;i<=2*n;i++) 
		printf("%d:%d,%d %llf,%llf,%llf\n",i,f[i].l,f[i].r,f[i].v,f[i].v2,f[i].lazy);
}
void pushup(int t){
	f[t].v=f[t<<1].v+f[t<<1|1].v,f[t].v2=f[t<<1].v2+f[t<<1|1].v2;
	return;
}
void pushdown(int t){
	if(!f[t].lazy)  return;
	int l1=f[t<<1].r-f[t<<1].l+1,l2=f[t<<1|1].r-f[t<<1|1].r+1;LLF k=f[t].lazy;
	if(f[t<<1].l!=f[t<<1].r)  f[t<<1].lazy+=k;
	if(f[t<<1|1].l!=f[t<<1|1].r)  f[t<<1|1].lazy+=k;
	f[t<<1].v2+=2*k*f[t<<1].v+l1*k*k;f[t<<1].v+=l1*f[t].lazy;
	f[t<<1|1].v2+=2*k*f[t<<1|1].v+l1*k*k;f[t<<1|1].v+=l1*f[t].lazy;
	f[t].lazy=0;return;
}
void build(int t,int l,int r){
	f[t].l=l,f[t].r=r;
	if(l==r){f[t].v=a[l],f[t].v2=a[l]*a[l];return;}
	int m=(l+r)/2;
	build(t<<1,l,m),build(t<<1|1,m+1,r);
	pushup(t);return;
}
void add(int t,int ul,int ur,int x){
	int l=f[t].l,r=f[t].r;
	if(ul<=l&&r<=ur){
		if(l!=r)  f[t].lazy+=x;
		f[t].v2+=2*x*f[t].v+(r-l+1)*x*x;
		f[t].v+=(r-l+1)*x;
		return;
	}
	int m=(l+r)/2;pushdown(t);
	if(ul<=m)  add(t<<1,ul,ur,x);
	if(ur>m)  add(t<<1|1,ul,ur,x);
	pushup(t);
	return;
}
LLF getsum(int t,int ul,int ur){
	int l=f[t].l,r=f[t].r;
	if(ul<=l&&r<=ur)  return f[t].v;
	LLF rt=0;int m=(l+r)/2;pushdown(t);
	if(ul<=m)  rt+=getsum(t<<1,ul,ur);
	if(ur>m)  rt+=getsum(t<<1|1,ul,ur);
	return rt;
}
LLF getsum2(int t,int ul,int ur){
	int l=f[t].l,r=f[t].r;
	if(ul<=l&&r<=ur)  return f[t].v2;
	LLF rt=0;int m=(l+r)/2;pushdown(t);
	if(ul<=m)  rt+=getsum2(t<<1,ul,ur);
	if(ur>m)  rt+=getsum2(t<<1|1,ul,ur);
	return rt;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)  scanf("%llf",&a[i]);
	build(1,1,n);
	while(m--){
		int t,x,y;scanf("%d%d%d",&t,&x,&y);LLF k,l;
		if(t==1){scanf("%llf",&k);add(1,x,y,k);}
		else k=getsum(1,x,y),l=y-x+1;
		if(t==2)  printf("%.4llf\n",k/l);
		if(t==3)  printf("%.4llf\n",getsum2(1,x,y)/l-k/l*k/l);
	}
	return 0;
}

样例AC,脚造了一组极限数据,结果IDE上显示负数,longdouble不能在DEV上运行调试

输入

5 100
1 1 1 1 1
1 1 1 99999
3 1 2

输出

-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500
-1795017295.7500

%%%

2021/7/12 17:49
加载中...