4821 [Sdoi2017]相关分析

题目描述:

雾。

题目分析:

rH4RE.png
rHhP2.png

题目链接:

qwq

Ac 代码:

#include <cstdio>
#include <iostream>
#define ls (o<<1)
#define rs (o<<1)|1
#define il inline
const int maxm=1e5+100;
inline int read() 
{
    char c=getchar(); int x=0, f=1;
    while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
    while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
    return x*f;
}
double x[maxm],y[maxm];
int n,m;
namespace seg{
    struct mex{
        double x,y,xy,x2,adx,ady,gx,gy;
        mex():gx(-1),gy(-1) {}
        mex(double x,double y,double xy,double x2): x(x), y(y), xy(xy), x2(x2),adx(0),ady(0),gx(-1),gy(-1){}
    } st[maxm<<2];
    mex operator + (const mex &x, const mex &y) { return mex(x.x+y.x,x.y+y.y,x.xy+y.xy,x.x2+y.x2); }
    il double js(double x) {return x*(x+1)*(2*x+1)/6;}
    il void cover(int o,double l,double r,double s,double t)
    {
        mex &now=st[o];
        now.gx=s,now.gy=t;
        now.adx=now.ady=0;
        double len=r-l+1,val=(l+r)*len/2;
        now.x=len*s+val;
        now.y=len*t+val;
        double val2=js(r)-js(l-1);
        now.xy=val2+val*(s+t)+s*t*len;
        now.x2=val2+val*(s+s)+s*s*len;
    }
    il void add(int o,double l,double r,double s,double t)
    {
        mex &now=st[o];
        now.ady+=s,now.adx+=t;
        double len=r-l+1;
        now.xy+=now.x*t+now.y*s+s*t*len;
        now.x2+=now.x*(s+s)+s*s*len; 
        now.x+=len*s;
        now.y+=len*t;
    }
    il void pushdown(int o,int l,int r)
    {
        int mid=(l+r)>>1;
        if(st[o].gx!=-1||st[o].gy!=-1)
        {
            cover(ls,l,mid,st[o].gx,st[o].gy);
            cover(rs,mid+1,r,st[o].gx,st[o].gy);
            st[o].gx=st[o].gy=-1;
        }
        if(st[o].adx||st[o].ady)
        {
            add(ls,l,mid,st[o].adx,st[o].ady);
            add(rs,mid+1,r,st[o].adx,st[o].ady);
            st[o].adx=st[o].ady=0;
        }
    }
    void build(int o,int l,int r)
    {
        if(l>=r) 
        {
            st[o]=(mex){x[l],y[l],x[l]*y[l],x[l]*x[l]};
            return;
        }
        int mid=(l+r)>>1;
        build(ls,l,mid);
        build(rs,mid+1,r);
        st[o]=st[ls]+st[rs];
    }
    void mofidy1(int o,int l,int r,int ql,int qr,double s,double t)
    {
        if(ql<=l&&r<=qr)
        {
            add(o,l,r,s,t);
            return;
        }
        int mid=(l+r)>>1;
        pushdown(o,l,r);
        if(ql<=mid) mofidy1(ls,l,mid,ql,qr,s,t);
        if(qr>mid) mofidy1(rs,mid+1,r,ql,qr,s,t);
        st[o]=st[ls]+st[rs];
    }
    void mofidy2(int o,int l,int r,int ql,int qr,double s,double t)
    {
        if(ql<=l&&r<=qr)
        {
            cover(o,l,r,s,t);
            return;
        }
        pushdown(o,l,r);
        int mid=(l+r)>>1;
        if(ql<=mid) mofidy2(ls,l,mid,ql,qr,s,t);
        if(qr>mid) mofidy2(rs,mid+1,r,ql,qr,s,t);
        st[o]=st[ls]+st[rs];
    }
    mex ask(int o,int l,int r,int ql,int qr)
    {
        mex h;
        if(ql<=l&&r<=qr)
         return st[o];
        pushdown(o,l,r);
        int mid=(l+r)>>1;
        if(qr<=mid) h=ask(ls,l,mid,ql,qr);
        else if(mid<ql) h=ask(rs,mid+1,r,ql,qr);
        else h=ask(ls,l,mid,ql,qr)+ask(rs,mid+1,r,ql,qr);
        return h;
    }
    il void getans(int ql,int qr)
    {
        mex ans=ask(1,1,n,ql,qr);
        double len=qr-ql+1;
        double ans1=ans.xy-ans.x*ans.y/len,ans2=ans.x2-ans.x*ans.x/len;
        printf("%.10lf\n",ans1/ans2);
    }
};
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
     x[i]=read();
    for(int i=1;i<=n;i++)
     y[i]=read();
    seg::build(1,1,n);
    for(int i=1;i<=m;i++)
    {
       int opt,l,r;
       double s,t;
       scanf("%d%d%d",&opt,&l,&r);
       if(opt==1) seg::getans(l,r);
       else
       {
         s=read(),t=read();
         if(opt==2) seg::mofidy1(1,1,n,l,r,s,t);
         else seg::mofidy2(1,1,n,l,r,s,t);
       }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值