WA2,9,10,求调
  • 板块P1471 方差
  • 楼主1a2b3
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/7 07:30
  • 上次更新2023/11/7 13:43:31
查看原帖
WA2,9,10,求调
112375
1a2b3楼主2023/11/7 07:30

不知道为什么输出了负数```cpp #include<bits/stdc++.h> using namespace std; #define rint register int #define ls (i<<1) #define rs (i<<1|1) #define mid ((l+r)>>1) #define double long double const int maxn=1e5+5; struct d{ int len; double h,per,pfh,fc; d(int len=0,double h=0,double per=0,double pfh=0,double fc=0): len(len),h(h),per(per),pfh(pfh),fc(fc){} }t[maxn<<2]; inline int read() { int f=1,x=0; char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^'0');c=getchar();} return xf; } int n,m; double a[maxn],tag[maxn<<2]; inline d hb(d a,d b) { int sum=a.len+b.len; return d(sum,a.h+b.h,(a.h+b.h)/sum,a.pfh+b.pfh,(a.pfh+b.pfh)/sum-(a.h+b.h)(a.h+b.h)/(sumsum)); } inline void mdf(int i,double k) { d o=t[i]; double pfh=o.pfh+2ko.h+o.lenkk,per=o.per+k; t[i]=d(o.len,o.h+o.lenk,per,pfh,pfh/o.len-per*per); tag[i]+=k; } inline void down(int i) { if(!tag[i])return; mdf(ls,tag[i]); mdf(rs,tag[i]); tag[i]=0; } inline void build(int i,int l,int r) { if(l==r){t[i]=d(1,a[l],a[l],a[l]*a[l],0);return;} build(ls,l,mid); build(rs,mid+1,r); t[i]=hb(t[ls],t[rs]); } inline void update(int i,int l,int r,int x,int y,double k) { if(l>y||r<x)return; if(l>=x&&r<=y){mdf(i,k);return;} down(i); update(ls,l,mid,x,y,k); update(rs,mid+1,r,x,y,k); t[i]=hb(t[ls],t[rs]); } inline d query(int i,int l,int r,int x,int y) { if(l>y||r<x)return d(0,0,0,0,0); if(l>=x&&r<=y)return t[i]; down(i); return hb(query(ls,l,mid,x,y),query(rs,mid+1,r,x,y)); } int main() { n=read(),m=read(); for(rint i=1;i<=n;i++) scanf("%Lf",&a[i]); build(1,1,n); for(rint i=1;i<=m;i++) { int opt=read(),x=read(),y=read(); double k; if(opt==1)scanf("%Lf",&k),update(1,1,n,x,y,k); else { d p=query(1,1,n,x,y); printf("%.4Lf\n",opt==2?p.per:p.fc); } } return 0; }

2023/11/7 07:30
加载中...