传送门

对于题目要求的东西,考虑拆开懒得拆了 ,可以发现有\(\sum x\sum y\sum x^2\sum xy\)四个变量影响最终结果,考虑维护这些值

下面记\(l,r\)为区间两端点

首先是区间加操作,可以这样维护$$\sum(x+s)=\sum x+(r-l+1)s$$$$\sum(y+s)=\sum y+(r-l+1)s$$$$\sum(x+s)^2=\sum x^2+2s\sum x+(r-l+1)s^2$$$$\sum(x+s)(y+t)=\sum xy+s\sum y+t\sum x+(r-l+1)st$$

然后是区间修改,区间修改可以看做先把所有\(x_i,y_i\)变成\(i\),然后再是区间加\((s,t)\)的操作,至于修改的话,用上平方和公式就很吼辣\(\sum_{i=1}^n i^2=\frac{n(n+1)(2n+1)}{6}\)

于是会修改成这样$$\sum x=\sum y=(r-l+1)(l+r)/2$$$$\sum x^2=\sum xy=\sum_{i=1}^r i2-\sum_{i=1}{l-1} i^2$$

然后求出询问区间的上述四个值,代入你所求的公式就行了

#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double
#define eps (1e-5) using namespace std;
const int N=120000+10;
il LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
struct node
{
db x,y,xx,xy;
node(){x=y=xx=xy=0;}
node operator + (const node &b) const
{
node an,a=*this;
an.x=a.x+b.x,an.y=a.y+b.y,an.xx=a.xx+b.xx,an.xy=a.xy+b.xy;
return an;
}
}tr[N<<2],nw;
db lz[N<<2][3],aa[N][2];
int n,m;
#define lc (o<<1)
#define rc ((o<<1)|1)
#define mid ((l+r)>>1)
il db sgmn2(db n){return n*(n+1)*(2*n+1)/6;}
il void ad(int o,int l,int r,db s,db t)
{
db len=r-l+1;
tr[o].xx+=s*tr[o].x*2+s*s*len;
tr[o].xy+=s*tr[o].y+t*tr[o].x+s*t*len;
tr[o].x+=len*s;
tr[o].y+=len*t;
lz[o][1]+=s,lz[o][2]+=t;
}
il void cg(int o,int l,int r)
{
db len=r-l+1;
lz[o][1]=lz[o][2]=0;
tr[o].x=tr[o].y=len*(db)(l+r)/2.0;
tr[o].xx=tr[o].xy=sgmn2(r)-sgmn2(l-1);
lz[o][0]=1;
}
il void psdn(int o,int l,int r)
{
if(lz[o][0]) cg(lc,l,mid),cg(rc,mid+1,r);
ad(lc,l,mid,lz[o][1],lz[o][2]),ad(rc,mid+1,r,lz[o][1],lz[o][2]);
lz[o][0]=lz[o][1]=lz[o][2]=0;
}
void bui(int o,int l,int r)
{
if(l==r){tr[o].x=aa[l][0],tr[o].y=aa[l][1],tr[o].xx=tr[o].x*tr[o].x,tr[o].xy=tr[o].x*tr[o].y;return;}
bui(lc,l,mid),bui(rc,mid+1,r);
tr[o]=tr[lc]+tr[rc];
}
void modif1(int o,int l,int r,int ll,int rr,db s,db t)
{
if(ll<=l&&r<=rr)
{
ad(o,l,r,s,t);
//psdn(o,l,r);
return;
}
psdn(o,l,r);
if(ll<=mid) modif1(lc,l,mid,ll,rr,s,t);
if(rr>mid) modif1(rc,mid+1,r,ll,rr,s,t);
tr[o]=tr[lc]+tr[rc];
}
void modif2(int o,int l,int r,int ll,int rr,db s,db t)
{
if(ll<=l&&r<=rr)
{
cg(o,l,r);ad(o,l,r,s,t);
//psdn(o,l,r);
return;
}
psdn(o,l,r);
if(ll<=mid) modif2(lc,l,mid,ll,rr,s,t);
if(rr>mid) modif2(rc,mid+1,r,ll,rr,s,t);
tr[o]=tr[lc]+tr[rc];
}
node quer(int o,int l,int r,int ll,int rr)
{
if(ll<=l&&r<=rr) return tr[o];
psdn(o,l,r);
node an;
if(ll<=mid) an=an+quer(lc,l,mid,ll,rr);
if(rr>mid) an=an+quer(rc,mid+1,r,ll,rr);
tr[o]=tr[lc]+tr[rc];
return an;
} int main()
{
n=rd(),m=rd();
for(int i=1;i<=n;i++) aa[i][0]=rd();
for(int i=1;i<=n;i++) aa[i][1]=rd();
bui(1,1,n);
while(m--)
{
int op=rd(),l=rd(),r=rd();
if(op==1)
{
nw=quer(1,1,n,l,r);
db len=r-l+1,gx=nw.x/len,gy=nw.y/len;
printf("%.6lf\n",(nw.xy-gx*nw.y-gy*nw.x+gx*gy*len)/(nw.xx-2*gx*nw.x+gx*gx*len));
}
else if(op==2)
{
db s=rd(),t=rd();
modif1(1,1,n,l,r,s,t);
}
else
{
db s=rd(),t=rd();
modif2(1,1,n,l,r,s,t);
}
}
return 0;
}

luogu P3707 [SDOI2017]相关分析的更多相关文章

  1. [题目] Luogu P3707 [SDOI2017]相关分析

    参考资料:[Luogu 3707] SDOI2017 相关分析 P3707 [SDOI2017]相关分析 TFRAC FRAC DFRAC \(\tfrac{\sum}{1}\) \(\frac{\s ...

  2. [Luogu 3707] SDOI2017 相关分析

    [Luogu 3707] SDOI2017 相关分析 前言 Capella 和 Frank 一样爱好天文学. 她常在冬季的夜晚,若有所思地望着东北方上空的五边形中,最为耀眼的一个顶点. 那一抹金黄曾带 ...

  3. P3707 [SDOI2017]相关分析

    P3707 [SDOI2017]相关分析 线段树裸题?但是真的很麻烦QAQ 题目给的式子是什么不用管,大力拆开,就是\(\frac{\sum x_iy_i-\overline xy_i-\overli ...

  4. 洛谷P3707 [SDOI2017]相关分析(线段树)

    题目描述 Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. Frank不仅喜欢观测,还喜欢分析观测到的数据.他经常分析两个 ...

  5. AC日记——[SDOI2017]相关分析 洛谷 P3707

    [SDOI2017]相关分析 思路: 裸线段树: (玄学ac): 代码: #include <bits/stdc++.h> using namespace std; #define max ...

  6. BZOJ4817 SDOI2017 相关分析

    4821: [Sdoi2017]相关分析 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge Description Frank对天文 ...

  7. [Sdoi2017]相关分析 [线段树]

    [Sdoi2017]相关分析 题意:沙茶线段树 md其实我考场上还剩一个多小时写了40分 其实当时写正解也可以吧1h也就写完了不过还要拍一下 正解代码比40分短2333 #include <io ...

  8. 【BZOJ4821】[SDOI2017]相关分析(线段树)

    [BZOJ4821][SDOI2017]相关分析(线段树) 题面 BZOJ 洛谷 题解 看看询问要求的东西是什么.把所有的括号拆开,不难发现要求的就是\(\sum x,\sum y,\sum xy,\ ...

  9. 4821: [Sdoi2017]相关分析

    4821: [Sdoi2017]相关分析 链接 分析: 大力拆式子,化简,然后线段树.注意精度问题与爆longlong问题. 代码: #include<cstdio> #include&l ...

随机推荐

  1. Centos 7最小化安装后配置

    关闭SELINUX vi /etc/sysconfig/selinux SELINUX=disabled :wq 配置网卡(最小化安装后ifconfig无法使用),该配置的前提是采用 NAT模式 vi ...

  2. Python调用C++类

    http://blog.csdn.net/liyuan_669/article/details/25361655 C++导出类到Python http://blog.csdn.net/arnozhan ...

  3. linux 内核参数优化----最大线程数限制及当前线程数查询

    1.总结系统限制有: /proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值 /proc/sys/kernel/thread-max max_user_p ...

  4. 自学Aruba2.1-Aruba Web UI --Dashbord面板介绍

    点击返回:自学Aruba之路 自学Aruba2.1-Aruba Web UI --Dashbord面板介绍 本文所有设计的的controller版本信息如下:  Aruba7205 V6.4.4.16 ...

  5. ANDROID OptionMenu 菜单列表

    package com.app.menu; import android.os.Bundle; import android.app.Activity; import android.content. ...

  6. 【BZOJ2208】[JSOI2010]连通数(Tarjan)

    [BZOJ2208][JSOI2010]连通数(Tarjan) 题面 BZOJ 洛谷 题解 先吐槽辣鸡洛谷数据,我写了个\(O(nm)\)的都过了. #include<iostream> ...

  7. qq空间爬取

    QQ_spider github传送门 QQ空间spider总结 花了将近3天吧,完成了低配版qq空间的爬虫,终于能上线刚一波了,还是蛮期待的. 流程很简单,模拟登录 ==>采集==>保存 ...

  8. Impacket官方使用指南

      什么是Impacket Impacket是用于处理网络协议的Python类的集合.Impacket专注于提供对数据包的简单编程访问,以及协议实现本身的某些协议(例如SMB1-3和MSRPC).数据 ...

  9. EXGCD 扩展欧几里得

    推荐:https://www.zybuluo.com/samzhang/note/541890 扩展欧几里得,就是求出来ax+by=gcd(x,y)的x,y 为什么有解? 根据裴蜀定理,存在u,v使得 ...

  10. Flash10 使用剪贴板得改变程序的写法了

    昨天一个客户告诉我,在她的电脑上无法复制图片的链接地址. 一开始,我以为是她操作有误,因为在我们的系统里使用的是一种“双保险”的复制方法. javascript + flash 两种方法来进行复制. ...