欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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);
        }
    }
}