传送门

对于题目要求的东西,考虑拆开懒得拆了 ,可以发现有\(\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. mybatis model属性注入多个对象 与model属性注入单个对象

  2. codeforces706C

    Hard problem CodeForces - 706C 现在有 n 个由小写字母组成的字符串.他想要让这些字符串按字典序排列,但是他不能交换任意两个字符串.他唯一能做的事是翻转字符串. 翻转第  ...

  3. day11 map函数

    场景模拟:实现一个列表内所有元素 *2 的效果 普通的实现方式单个列表是可以做到很轻松的实现,但是如果我又多个列表都要这个操作,那每个都操作就会重复代码 ret = [] num_1 = [1,2,1 ...

  4. 【POI每日题解 #6】KRA-The Disks

    题目链接 : [POI2006]KRA-The Disks 好有既视感啊... 注意一下输入输出 输入是从上到下输入箱子的宽度 输出是最上面的积木停在哪一层 即 箱子高度 - 积木高度 + 1 在初始 ...

  5. 自学Aruba6.2-控制器基本维护操作(web页面配置)

    点击返回:自学Aruba之路 自学Aruba6.2-控制器基本维护操作(web页面配置) 1 显示当前控制器版本 Dashboard---Controller中 2 升级Aruab os版本 Main ...

  6. Ubuntu 13.04下构建Qt5开发环境

    虽然Qt命运多舛,但是也阻挡不了程序员对它的喜爱.经历了一系列波折之后,现在到在芬兰公司Digia手中,Qt又将迎来一个发展.Qt5就是在这种情况之下发布的.正值Ubuntu刚刚发布了13.04版,我 ...

  7. POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Network / FZU 1161 (网络流,最大流)

    POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Networ ...

  8. 洛谷P1012 拼数 string

    又是大水题... 这一题过水,令人无法接受...... 但是如果我们不知道string的一个神奇的性质的话,就会很难受. 我一开始手写 < 号,但是发现如果 string a 的前一部分恰好是 ...

  9. gdb调试5--工程项目的断点调试

    之前说过断点调试,但是针对的是单文件的断点调试.在实际应用中,一个项目是多目录多文件的 参考资料:gdb debugger 目录结构: $ tree .├── gdbSomeFiles.cpp├── ...

  10. 用webstorm来开发微信小程序之less的配置

    1.安装less. 安装好node之后,打开运行-->cmd-->进入安装node的文件夹目录-->输入 npm install -g less. 然后自动就会在C:\Users\A ...