传送门

对于题目要求的东西,考虑拆开懒得拆了 ,可以发现有\(\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. 我终于激活Windows Server2008 R2了!!

    经过我不懈的努力,在重装两次系统后,我终于实现了win2008的KMS激活.这个方法可以避免虚拟机架设KMS服务器的麻烦.现将激活方法发布如下. 首先要选择安装的操作系统.Windows Server ...

  2. Jenkins之前置替换脚本内容

    在执行Jenkins任务前,需要修改执行的工程的某个文件中的内容,在前置步骤中编写脚本进行修改. Pre Steps Windows batch script @echo off CHCP setlo ...

  3. selenium之下载

    # 测试下载功能,保存文件到指定的目录 # 不同的浏览器配置是不同的,本例使用chrome浏览器 # author:gongxr # date:2017-07-25 import time from ...

  4. python之类的继承

    # 类的的操作实例 # 子类ECar继承父类Car,并将实例Battery用作属性 class Car(): def __init__(self, name, model, year): self.n ...

  5. Python——反射

    反射的定义:使用字符串类型的名字 去操作变量 hasattr 函数 与getatter配合使用,用来判断变量是否存在 if hasatter(my,'a'):#如果为真执行 getatter(my,' ...

  6. String在内存中如何存储(Java)

    JDK1.8中JVM把String常量池移入了堆中,同时取消了“永久代”,改用元空间代替(Metaspace)java中对String对象特殊对待,所以在heap区域分成了两块,一块是字符串常量池(S ...

  7. MT【230】一道代数不等式

    设$a,b,c>0,$满足$a+b+c\le abc$证明:$\dfrac{1}{\sqrt{1+a^2}}+\dfrac{1}{\sqrt{1+b^2}}+\dfrac{1}{\sqrt{1+ ...

  8. 01 Zabbix采集数据方式

    Zabbix采集数据方式 1. zabbix采集数据方式: 基于专用agent   被监控的设备上面安装agent软件,这个agent必须在设备上面有采集数据的权限 基于SNMP,  net-snmp ...

  9. Android GPS定位测试(附效果图)

    今天因为工作需要,把以前编写的一个GPS测试程序拿出来重新修改了一下.这个程序说起来有些历史了,是我11年编写的,那时候学了Android开发没多久,算是一个实验性的作品.现在工作需要,重新拿出来修整 ...

  10. Spring MVC 起步

    跟踪Spring MVC的请求 在请求离开浏览器时①,会带有用户所请求内容的信息,至少会包含请求的URL. 请求旅程的第一站是Spring的DispatcherServlet.与大多数基于Java的W ...