luogu P3707 [SDOI2017]相关分析
对于题目要求的东西,考虑拆开懒得拆了 ,可以发现有\(\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]相关分析的更多相关文章
- [题目] Luogu P3707 [SDOI2017]相关分析
参考资料:[Luogu 3707] SDOI2017 相关分析 P3707 [SDOI2017]相关分析 TFRAC FRAC DFRAC \(\tfrac{\sum}{1}\) \(\frac{\s ...
- [Luogu 3707] SDOI2017 相关分析
[Luogu 3707] SDOI2017 相关分析 前言 Capella 和 Frank 一样爱好天文学. 她常在冬季的夜晚,若有所思地望着东北方上空的五边形中,最为耀眼的一个顶点. 那一抹金黄曾带 ...
- P3707 [SDOI2017]相关分析
P3707 [SDOI2017]相关分析 线段树裸题?但是真的很麻烦QAQ 题目给的式子是什么不用管,大力拆开,就是\(\frac{\sum x_iy_i-\overline xy_i-\overli ...
- 洛谷P3707 [SDOI2017]相关分析(线段树)
题目描述 Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. Frank不仅喜欢观测,还喜欢分析观测到的数据.他经常分析两个 ...
- AC日记——[SDOI2017]相关分析 洛谷 P3707
[SDOI2017]相关分析 思路: 裸线段树: (玄学ac): 代码: #include <bits/stdc++.h> using namespace std; #define max ...
- BZOJ4817 SDOI2017 相关分析
4821: [Sdoi2017]相关分析 Time Limit: 10 Sec Memory Limit: 128 MBSec Special Judge Description Frank对天文 ...
- [Sdoi2017]相关分析 [线段树]
[Sdoi2017]相关分析 题意:沙茶线段树 md其实我考场上还剩一个多小时写了40分 其实当时写正解也可以吧1h也就写完了不过还要拍一下 正解代码比40分短2333 #include <io ...
- 【BZOJ4821】[SDOI2017]相关分析(线段树)
[BZOJ4821][SDOI2017]相关分析(线段树) 题面 BZOJ 洛谷 题解 看看询问要求的东西是什么.把所有的括号拆开,不难发现要求的就是\(\sum x,\sum y,\sum xy,\ ...
- 4821: [Sdoi2017]相关分析
4821: [Sdoi2017]相关分析 链接 分析: 大力拆式子,化简,然后线段树.注意精度问题与爆longlong问题. 代码: #include<cstdio> #include&l ...
随机推荐
- xhtml 意義
xhtml是html和xml的結合體. xhtml包含所有xml和html4.0結合的部分. xml是描述語言,html是顯示語言.二者結合可以產生形式良好的文檔. 不僅可以適用與電腦瀏覽器,也可以適 ...
- python之unittest单元测试
# unittest单元测试 import unittest from class_demo import Car class TestCar(unittest.TestCase): '''测试Car ...
- flask再学习-思考之怎么从数据库中查询数据在页面展示!
看别人视频觉得很简单,要自己做蒙蔽了!这样子.NO! 1. 流程: 首先要有和数据库连接的驱动!一般有PYMySQL mysqlclient 等 使用扩展Flask-SQLAlchemy 获得orm对 ...
- ansible系列4-关闭ssh首次连接时提示
在ansible配置文件中找到 /etc/ansible/ansible.cfg 方法1 在配置文件中找到 了解到问题原因为,我们了解到进行ssh连接时,可以使用-o参数将StrictHostKeyC ...
- BZOJ2793[Poi2012]Vouchers——枚举
题目描述 考虑正整数集合,现在有n组人依次来取数,假设第i组来了x人,他们每个取的数一定是x的倍数,并且是还剩下的最小的x个.正整数中有m个数被标成了幸运数,问有哪些人取到了幸运数. 输入 第一行一个 ...
- day5 if else elif 判断语句
age_of_princal = 56 guess_age = int( input(">>:") ) '''伪代码,提供思路用 if guess_age == age ...
- vs2017 C4996 错误
严重性 代码 说明 项目 文件 行 禁止显示状态错误 C4996 'strcpy': This function or variable may be ...
- [转]GDB
gdb调试coredump文件 gcc -g main.c //在目标文件加入源代码的信息 gdb a.out (gdb) start //开始调试 (gdb) n //一条一条执行 (gdb) st ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- python开启httpserver服务在自动化测试中的一个小运用
httpserver可以在本机启动一个python实现的web服务器,在自动化测试中,可以将生成测试报告的目录开放给项目组同事. 先安装python 自动化测试框架,生成报告的目录D:\Automat ...