题目:
题解:
忘了一个加号,找错nnnnnnnn年
正经说一下,其实就是简单的化化化化化式子
代码:
#include <cstdio> #include <iostream> #define N 100000 using namespace std; int n,m; double he[N*4+5],pf[N*4+5],a[N+5],delta[N*4+5]; void updata(int now) { he[now]=he[now<<1]+he[(now<<1)+1]; pf[now]=pf[now<<1]+pf[(now<<1)+1]; } void pushdown(int now,int y) { if (delta[now]) { delta[now<<1]+=delta[now]; pf[now<<1]+=2*delta[now]*he[now<<1]+(y-y/2)*delta[now]*delta[now]; he[now<<1]+=(y-y/2)*delta[now]; delta[(now<<1)+1]+=delta[now]; pf[(now<<1)+1]+=2*delta[now]*he[(now<<1)+1]+(y/2)*delta[now]*delta[now]; he[(now<<1)+1]+=(y/2)*delta[now]; delta[now]=0; } } void build(int now,int l,int r) { int mid=(l+r)>>1; if (l==r) { he[now]=a[l]; pf[now]=a[l]*a[l]; return; } build(now<<1,l,mid); build((now<<1)+1,mid+1,r); updata(now); } void change(int now,int l,int r,int lrange,int rrange,double k) { if (lrange<=l && rrange>=r) { pf[now]+=2*k*he[now]+(r-l+1)*k*k; he[now]+=(r-l+1)*k; delta[now]+=k; return; } int mid=(l+r)>>1; pushdown(now,r-l+1); if (mid>=lrange) change(now<<1,l,mid,lrange,rrange,k); if (mid<rrange) change((now<<1)+1,mid+1,r,lrange,rrange,k); updata(now); } double findpjs(int now,int l,int r,int lrange,int rrange) { if (lrange<=l && rrange>=r) return he[now]; pushdown(now,r-l+1); int mid=(l+r)>>1;double ans=0; if (mid>=lrange) ans+=findpjs(now<<1,l,mid,lrange,rrange); if (mid<rrange) ans+=findpjs((now<<1)+1,mid+1,r,lrange,rrange); updata(now); return ans; } double findpfs(int now,int l,int r,int lrange,int rrange) { if (lrange<=l && rrange>=r) return pf[now]; pushdown(now,r-l+1); int mid=(l+r)>>1;double ans=0; if (mid>=lrange) ans+=findpfs(now<<1,l,mid,lrange,rrange); if (mid<rrange) ans+=findpfs((now<<1)+1,mid+1,r,lrange,rrange); updata(now); return ans; } int main() { int i,j,id; scanf("%d%d",&n,&m); for (i=1;i<=n;i++) scanf("%lf",&a[i]); build(1,1,n); for (i=1;i<=m;i++) { int x,y;double k; scanf("%d",&id); scanf("%d%d",&x,&y); if (id==1) { scanf("%lf",&k); change(1,1,n,x,y,k); } else if (id==2) { double ll=findpjs(1,1,n,x,y)/(y-x+1); printf("%.4lf\n",ll); } else { double hh=findpfs(1,1,n,x,y)/(y-x+1); double ll=findpjs(1,1,n,x,y)/(y-x+1); hh-=ll*ll; printf("%.4lf\n",hh); } } }