2017.9.17 相关分析 思考记录
程序员文章站
2022-03-14 19:59:09
...
想不明白考场上怎么爆零了、可能太自信了
基本用初中的数学就可以把式子化成要维护的东西,x^2,x*y,x,y 然后就计算就行了
注意: 循环变量作为取值需要long long
不要太自信
不对拍就不要交
码:
#include<iostream>
#include<cstdio>
using namespace std;
#define zuo o<<1,l,mid
#define you o<<1|1,mid+1,r
#define N 100005
int n,m,j,a,b,op;
long long i;
double xxx[N],yyy[N],x[N<<2],y[N<<2],er[N],x2[N<<2],xy[N<<2],gbjs[N<<2],gbjt[N<<2],jbjs[N<<2],jbjt[N<<2],lx,ly,lxy,lx2,S,T,ans;
bool yjbj[N<<2],ygbj[N<<2];
void up(int o)
{
int ll=o<<1;
int rr=o<<1|1;
x[o]=x[ll]+x[rr];
y[o]=y[ll]+y[rr];
x2[o]=x2[ll]+x2[rr];
xy[o]=xy[ll]+xy[rr];
}
void down(int o,long long l,long long r)
{
int ll=o<<1;
int rr=o<<1|1;
long long mid=(l+r)>>1;
if(ygbj[o])
{
long double s=gbjs[o];
long double t=gbjt[o];
ygbj[ll]=1;
ygbj[rr]=1;
gbjs[ll]=gbjs[rr]=gbjs[o];
gbjt[ll]=gbjt[rr]=gbjt[o];
ygbj[o]=yjbj[ll]=yjbj[rr]=jbjs[ll]=jbjs[rr]=jbjt[ll]=jbjt[rr]=0;
x[ll]=(l+mid)*(mid-l+1)/2+s*(mid-l+1);
y[ll]=(l+mid)*(mid-l+1)/2+t*(mid-l+1);
xy[ll]=(l+mid)*(mid-l+1)/2*(s+t)+er[mid]-er[l-1]+s*t*(mid-l+1);
x2[ll]=s*s*(mid-l+1)+(l+mid)*(mid-l+1)*s+er[mid]-er[l-1];
mid+=1;
x[rr]=(mid+r)*(r-mid+1)/2+s*(r-mid+1);
y[rr]=(mid+r)*(r-mid+1)/2+t*(r-mid+1);
xy[rr]=(mid+r)*(r-mid+1)/2*(s+t)+er[r]-er[mid-1]+s*t*(r-mid+1);
x2[rr]=s*s*(r-mid+1)+(mid+r)*(r-mid+1)*s+er[r]-er[mid-1];
mid--;
}
if(yjbj[o])
{
long double s=jbjs[o];
long double t=jbjt[o];
yjbj[o]=0;
yjbj[ll]=1;
yjbj[rr]=1;
jbjs[ll]+=jbjs[o]; jbjs[rr]+=jbjs[o];
jbjt[ll]+=jbjt[o]; jbjt[rr]+=jbjt[o];
jbjs[o]=0; jbjt[o]=0;
xy[ll]+=(x[ll]*t)+(y[ll]*s)+s*t*(mid-l+1);
x2[ll]+=s*s*(mid-l+1)+2*x[ll]*s;
x[ll]+=(mid-l+1)*s;
y[ll]+=(mid-l+1)*t;
mid++;
xy[rr]+=(x[rr]*t)+(y[rr]*s)+s*t*(r-mid+1);
x2[rr]+=s*s*(r-mid+1)+2*x[rr]*s;
x[rr]+=(r-mid+1)*s;
y[rr]+=(r-mid+1)*t;
}
}
void jian(int o,long long l,long long r)
{
if(l==r)
{
x[o]=xxx[l];
y[o]=yyy[l];
x2[o]=x[o]*x[o];
xy[o]=x[o]*y[o];
return;
}
int mid=(l+r)>>1;
jian(zuo);
jian(you);
up(o);
}
void gai(int o,long long l,long long r)
{
if(a<=l&&r<=b)
{
if(op==1)
{
lxy+=xy[o];
lx+=x[o];
ly+=y[o];
lx2+=x2[o];
}
if(op==2)
{
xy[o]+=(x[o]*T)+(y[o]*S)+S*T*(r-l+1);
x2[o]+=S*S*(r-l+1)+2*x[o]*S;
x[o]+=(r-l+1)*S;
y[o]+=(r-l+1)*T;
yjbj[o]=1;
jbjs[o]+=S;
jbjt[o]+=T;
}
if(op==3)
{
x[o]=(l+r)*(r-l+1)/2+S*(r-l+1);
y[o]=(l+r)*(r-l+1)/2+T*(r-l+1);
xy[o]=(l+r)*(r-l+1)/2*(S+T)+er[r]-er[l-1]+S*T*(r-l+1);
x2[o]=S*S*(r-l+1)+(l+r)*(r-l+1)*S+er[r]-er[l-1];
jbjs[o]=jbjt[o]=0; yjbj[o]=0;
gbjs[o]=S;
gbjt[o]=T;
ygbj[o]=1;
}
return ;
}
down(o,l,r);
int mid=(r+l)>>1;
if(a<=mid)gai(zuo);
if(b>mid)gai(you);
up(o);
}
int main()
{
scanf("%d%d",&n,&m);
er[0]=0;
for(i=1;i<=n;i++)
er[i]=er[i-1]+i*i;
for(i=1;i<=n;i++)scanf("%lf",&xxx[i]);
for(i=1;i<=n;i++)scanf("%lf",&yyy[i]);
jian(1,1,n);
for(i=1;i<=m;i++)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d%d",&a,&b); lx=lx2=ly=lxy=0;
gai(1,1,n);
// cout<<endl<<lx<<" "<<lx2<<" "<<ly<<" "<<lxy<<endl;
double xx=lx/(b-a+1);
double yy=ly/(b-a+1);
ans=xx*yy*(b-a+1)-xx*ly-yy*lx+lxy;
ans=ans/(xx*xx*(b-a+1)+lx2-2*xx*lx);
printf("%.10lf\n",ans);
}
if(op==2||op==3)
{
scanf("%d%d%lf%lf",&a,&b,&S,&T);
gai(1,1,n);
}
}
}
上一篇: php中tr标签是什么意思
下一篇: php des 加密解密实例