题目:
题解:
忘了一个加号,找错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);
}
}
}