SDOI2017相关分析 线段树

题目

https://loj.ac/problem/2005

思路

\[ \sum_{L}^{R}{(x_i-x)^{2}} \]

\[ \sum_{L}^{R}{(x_i^2-2*x_i*x+x^{2})} \]

\[ \sum_{L}^{R}{x_i^2}-2*x*\sum_{L}^{R}x_i+(r-l+1)x^{2} \]

\[ \sum_{L}^{R}x_{i}^2-2*\frac{1}{r-l+1}(\sum_{L}^{R}x_i)^2+\frac{1}{r-l+1}*(\sum_{L}^{R}x)^2 \]

\[ \sum_{L}^{R}x_{i}*x_{i}-\frac{1}{r-l+1}\sum_{L}^{R}x_i*\sum_{L}^{R}x_i \]

\[ \sum_{L}^{R}(x_i-x)(y_i-y) \]

\[ \sum_{L}^{R}(x_i*y_i-x*y_i-y*x_i+x*y) \]

\[ \sum_{L}^{R}x_i*y_i-\sum_{L}^{R}x_i*y-\sum_{L}^{R}y_i*x+(r-l+1)*x*y \]

\[ \sum_{L}^{R}x_i*y_i-\frac{1}{r-l+1}\sum_{L}^{R}x_i\sum_{L}^{R}*y_i-\frac{1}{r-l+1}\sum_{L}^{R}*x_i\sum_{L}^{R}y_i+(r-l+1)*x*y \]

\[ \sum_{L}^{R}x_i*y_i-\frac{2}{r-l+1}\sum_{L}^{R}x_i\sum_{L}^{R}*y_i+\frac{1}{(r-l+1)}\sum_{L}^{R}x_i*\sum_{L}^{R}y_i \]

\[ \sum_{L}^{R}x_i*y_i-\frac{1}{r-l+1}\sum_{L}^{R}x_i\sum_{L}^{R}*y_i \]

\[ \frac{\sum_{L}^{R}x_i*y_i-\frac{1}{r-l+1}\sum_{L}^{R}x_i\sum_{L}^{R}*y_i}{\sum_{L}^{R}x_{i}*x_{i}-\frac{1}{r-l+1}\sum_{L}^{R}x_i\sum_{L}^{R}x_i} \]

其实不用这么麻烦的、、
好了,剩下的去维护吧
好吧,我太菜了
要开long doule

代码

#include <bits/stdc++.h>
#define ll long double
#define ls rt<<1
#define rs rt<<1|1
using namespace std;
const int N=2e5+7;
int read() {
    int x=0,f=1;char s=getchar();
    for (;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
    for (;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
    return x*f;
}
ll x[N],y[N];
struct node {
    int l,r,siz;
    ll tot[2],pingfang,chengji;
    ll lazy,S,T;
}e[N<<2];
void pushup(int rt) {
    e[rt].tot[0]=e[ls].tot[0]+e[rs].tot[0];
    e[rt].tot[1]=e[ls].tot[1]+e[rs].tot[1];
    e[rt].pingfang=e[ls].pingfang+e[rs].pingfang;
    e[rt].chengji=e[ls].chengji+e[rs].chengji;
}
ll calc(int x) {return (ll)x*(x+1)/2;};
ll calc2(int x) {return (ll)x*(x+1)/2*(2*x+1)/3;};
void pushdown(int rt) {
    if(e[rt].lazy) {
        e[ls].tot[0]=e[ls].tot[1]=calc(e[ls].r)-calc(e[ls].l-1);
        e[ls].pingfang=e[ls].chengji=calc2(e[ls].r)-calc2(e[ls].l-1);
        e[ls].S=e[ls].T=0;
        e[ls].lazy=1;

        e[rs].tot[0]=e[rs].tot[1]=calc(e[rs].r)-calc(e[rs].l-1);
        e[rs].pingfang=e[rs].chengji=calc2(e[rs].r)-calc2(e[rs].l-1);
        e[rs].S=e[rs].T=0;
        e[rs].lazy=1;

        e[rt].lazy=0;
    }
    if(e[rt].S||e[rt].T) {
        e[ls].chengji+=e[ls].tot[0]*e[rt].T+e[ls].tot[1]*e[rt].S+e[rt].S*e[rt].T*e[ls].siz;
        e[ls].pingfang+=e[ls].tot[0]*2*e[rt].S+e[rt].S*e[rt].S*e[ls].siz;
        e[ls].tot[0]+=e[ls].siz*e[rt].S;
        e[ls].tot[1]+=e[ls].siz*e[rt].T;
        e[ls].S+=e[rt].S;
        e[ls].T+=e[rt].T;
        
        e[rs].chengji+=e[rs].tot[0]*e[rt].T+e[rs].tot[1]*e[rt].S+e[rt].S*e[rt].T*e[rs].siz;
        e[rs].pingfang+=e[rs].tot[0]*2*e[rt].S+e[rt].S*e[rt].S*e[rs].siz;
        e[rs].tot[0]+=e[rs].siz*e[rt].S;
        e[rs].tot[1]+=e[rs].siz*e[rt].T;
        e[rs].S+=e[rt].S;
        e[rs].T+=e[rt].T;

        e[rt].S=e[rt].T=0;
    }
}
void build(int l,int r,int rt) {
    e[rt].l=l,e[rt].r=r,e[rt].siz=r-l+1;
    if(l==r) {
        e[rt].tot[0]=x[l];
        e[rt].tot[1]=y[l];
        e[rt].pingfang=x[l]*x[l];
        e[rt].chengji=x[l]*y[l];
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,ls);
    build(mid+1,r,rs);
    pushup(rt);
}
void modify_1(int L,int R,ll S,ll T,int rt) {
    if(L<=e[rt].l&&e[rt].r<=R) {
        e[rt].chengji+=e[rt].tot[0]*T+e[rt].tot[1]*S+S*T*e[rt].siz;
        e[rt].pingfang+=e[rt].tot[0]*2*S+S*S*e[rt].siz;
        e[rt].tot[0]+=e[rt].siz*S;
        e[rt].tot[1]+=e[rt].siz*T;
        e[rt].S+=S;
        e[rt].T+=T;
        return;
    }
    pushdown(rt);
    int mid=(e[rt].l+e[rt].r)>>1;
    if(L<=mid) modify_1(L,R,S,T,ls);
    if(R>mid) modify_1(L,R,S,T,rs);
    pushup(rt);
}
void modify_2(int L,int R,int rt) {
    if(L<=e[rt].l&&e[rt].r<=R) {
        e[rt].tot[0]=e[rt].tot[1]=calc(e[rt].r)-calc(e[rt].l-1);
        e[rt].pingfang=e[rt].chengji=calc2(e[rt].r)-calc2(e[rt].l-1);
        e[rt].S=e[rt].T=0;
        e[rt].lazy=1;
        return;
    }
    pushdown(rt);
    int mid=(e[rt].l+e[rt].r)>>1;
    if(L<=mid) modify_2(L,R,ls);
    if(R>mid) modify_2(L,R,rs);
    pushup(rt);
}
ll query(int L,int R,int opt,int rt) {
    if(L<=e[rt].l&&e[rt].r<=R) {
        if(opt==0) return e[rt].tot[0];
        if(opt==1) return e[rt].tot[1];
        if(opt==2) return e[rt].pingfang;
        if(opt==3) return e[rt].chengji;
    }
    pushdown(rt);
    int mid=(e[rt].l+e[rt].r)>>1;
    ll ans=0;
    if(L<=mid) ans+=query(L,R,opt,ls);
    if(R>mid) ans+=query(L,R,opt,rs);
    pushup(rt);
    return ans;
}
int main() {
    int n=read(),m=read();
    for(int i=1;i<=n;++i) x[i]=read();
    for(int i=1;i<=n;++i) y[i]=read();
    build(1,n,1);
    while(m--) {
        int opt=read(),L=read(),R=read();
        if(opt==1) {
            ll tot_x=query(L,R,0,1);
            ll tot_y=query(L,R,1,1);
            ll tot_x_x=query(L,R,2,1);
            ll tot_x_y=query(L,R,3,1);
            long double a=tot_x_y-tot_x*tot_y/(R-L+1);
            long double b=tot_x_x-tot_x*tot_x/(R-L+1);
            printf("%.10Lf\n",(long double)a/b);
        } else if(opt==2) {
            ll S=read(),T=read();
            modify_1(L,R,(ll)S,(ll)T,1);
        } else {
            ll S=read(),T=read();
            modify_2(L,R,1);
            modify_1(L,R,(ll)S,(ll)T,1);
        }
    }
    return 0;
}
全部评论

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
06-04 09:27
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务