把两个式子拆开

Σ(xi-px)(yi-py) =Σ xiyi + py * Σ xi - px * Σ yi + Σ 1* px * py

Σ (xi-px)² = Σ xi² +  px * Σ xi * 2  + Σ 1* px²

用线段树维护 Σxiyi , Σxi ,Σ yi , Σ xi²

同时维护两个标记:增加和修改

对于增加操作,假设给x增加a,给y增加b

Σ (xi+a)(yi+b)= Σ xiyi + b * Σ xi + a * Σ yi + Σ 1*a*b

Σ (xi + a )² =   Σ xi² + 2 * a * Σ xi + Σ 1 * a²

Σ xi += Σ 1 * s

Σ yi += Σ 1 * t

对于修改操作,假设x修改为s+i,y修改为t+i

Σ xiyi = Σ (s+i)(t+i)= Σ 1 * s * t + Σ  s * i + Σ t * i + Σ 1 * i² = Σ 1 * s * t + (s+t)* Σ i +  Σ 1 * i²

同理,Σ xi² = Σ 1 * s *s + s * 2 * Σ i +  Σ 1 * i²

Σ xi = Σ 1 * s +Σ i

Σ yi = Σ 1 * t +Σ i

所以 线段树还需要维护 Σi ,Σ i²

然后就是增加标记与修改标记的同时维护

可参考codevs 线段树练习5 http://www.cnblogs.com/TheRoadToTheGold/p/6690565.html

#include<cstdio>
#define N 100001
using namespace std;
int n,m,opl,opr;
double totx,toty,totxy,totxx;
double px,py,ans,fz,fm;
double x[N],y[N],s,t;
struct node
{
int l,r,siz;
double sumx,sumy,fx,fy,xx,xy;
double tagx,tagy;
bool v;
double toti,toti2;
}tr[N*];
void up(int k)
{
tr[k].sumx=tr[k<<].sumx+tr[k<<|].sumx;
tr[k].sumy=tr[k<<].sumy+tr[k<<|].sumy;
tr[k].xx=tr[k<<].xx+tr[k<<|].xx;
tr[k].xy=tr[k<<].xy+tr[k<<|].xy;
tr[k].toti=tr[k<<].toti+tr[k<<|].toti;
tr[k].toti2=tr[k<<].toti2+tr[k<<|].toti2;
}
void down(int k)
{
tr[k<<].xy+=tr[k].fy*tr[k<<].sumx+tr[k].fx*tr[k<<].sumy+tr[k].fx*tr[k].fy*tr[k<<].siz;
tr[k<<|].xy+=tr[k].fy*tr[k<<|].sumx+tr[k].fx*tr[k<<|].sumy+tr[k].fx*tr[k].fy*tr[k<<|].siz;
tr[k<<].xx+=tr[k].fx*tr[k<<].sumx+tr[k].fx*tr[k<<].sumx+tr[k].fx*tr[k].fx*tr[k<<].siz;
tr[k<<|].xx+=tr[k].fx*tr[k<<|].sumx+tr[k].fx*tr[k<<|].sumx+tr[k].fx*tr[k].fx*tr[k<<|].siz;
tr[k<<].sumx+=tr[k<<].siz*tr[k].fx;
tr[k<<].sumy+=tr[k<<].siz*tr[k].fy;
tr[k<<|].sumx+=tr[k<<|].siz*tr[k].fx;
tr[k<<|].sumy+=tr[k<<|].siz*tr[k].fy;
tr[k<<].fx+=tr[k].fx;
tr[k<<].fy+=tr[k].fy;
tr[k<<|].fx+=tr[k].fx;
tr[k<<|].fy+=tr[k].fy;
tr[k].fx=tr[k].fy=;
}
void down2(int k)
{
tr[k<<].sumx=tr[k].tagx*tr[k<<].siz+tr[k<<].toti;
tr[k<<|].sumx=tr[k].tagx*tr[k<<|].siz+tr[k<<|].toti;
tr[k<<].sumy=tr[k].tagy*tr[k<<].siz+tr[k<<].toti;
tr[k<<|].sumy=tr[k].tagy*tr[k<<|].siz+tr[k<<|].toti;
tr[k<<].xy=tr[k].tagx*tr[k].tagy*tr[k<<].siz+tr[k<<].toti*(tr[k].tagx+tr[k].tagy)+tr[k<<].toti2;
tr[k<<|].xy=tr[k].tagx*tr[k].tagy*tr[k<<|].siz+tr[k<<|].toti*(tr[k].tagx+tr[k].tagy)+tr[k<<|].toti2;
tr[k<<].xx=tr[k].tagx*tr[k].tagx*tr[k<<].siz+tr[k<<].toti*tr[k].tagx*+tr[k<<].toti2;
tr[k<<|].xx=tr[k].tagx*tr[k].tagx*tr[k<<|].siz+tr[k<<|].toti*tr[k].tagx*+tr[k<<|].toti2;
tr[k<<].tagx=tr[k].tagx;
tr[k<<|].tagx=tr[k].tagx;
tr[k<<].tagy=tr[k].tagy;
tr[k<<|].tagy=tr[k].tagy;
tr[k<<].v=tr[k<<|].v=true;
tr[k].tagx=tr[k].tagy=tr[k].v=;
tr[k<<].fx=tr[k<<].fy=;
tr[k<<|].fx=tr[k<<|].fy=;
}
void build(int k,int l,int r)
{
tr[k].l=l; tr[k].r=r; tr[k].siz=r-l+;
if(l==r)
{
tr[k].sumx=x[l];
tr[k].sumy=y[l];
tr[k].xx=x[l]*x[l];
tr[k].xy=x[l]*y[l];
tr[k].toti=l;
tr[k].toti2=(double)l*l;
return;
}
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
up(k);
}
void query(int k)
{
if(tr[k].l>=opl&&tr[k].r<=opr)
{
totx+=tr[k].sumx;
toty+=tr[k].sumy;
totxy+=tr[k].xy;
totxx+=tr[k].xx;
return;
}
if(tr[k].v) down2(k);
if(tr[k].fx||tr[k].fy) down(k);
int mid=tr[k].l+tr[k].r>>;
if(opl<=mid) query(k<<);
if(opr>mid) query(k<<|);
}
void add(int k)
{
if(tr[k].l>=opl&&tr[k].r<=opr)
{
tr[k].xy+=t*tr[k].sumx+s*tr[k].sumy+s*t*tr[k].siz;
tr[k].xx+=s*tr[k].sumx+s*tr[k].sumx+s*s*tr[k].siz;
tr[k].sumx+=s*tr[k].siz;
tr[k].sumy+=t*tr[k].siz;
tr[k].fx+=s;
tr[k].fy+=t;
return;
}
if(tr[k].v) down2(k);
if(tr[k].fx||tr[k].fy) down(k);
int mid=tr[k].l+tr[k].r>>;
if(opl<=mid) add(k<<);
if(opr>mid) add(k<<|);
up(k);
}
void change2(int k)
{
if(tr[k].l>=opl&&tr[k].r<=opr)
{
tr[k].fx=tr[k].fy=;
tr[k].tagx=s;tr[k].tagy=t;
tr[k].v=true;
tr[k].sumx=s*tr[k].siz+tr[k].toti;
tr[k].sumy=t*tr[k].siz+tr[k].toti;
tr[k].xy=s*t*tr[k].siz+tr[k].toti*(s+t)+tr[k].toti2;
tr[k].xx=s*s*tr[k].siz+tr[k].toti*s*+tr[k].toti2;
return;
}
if(tr[k].v) down2(k);
if(tr[k].fx||tr[k].fy) down(k);
int mid=tr[k].l+tr[k].r>>;
if(opl<=mid) change2(k<<);
if(opr>mid) change2(k<<|);
up(k);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%lf",&x[i]);
for(int i=;i<=n;i++) scanf("%lf",&y[i]);
build(,,n);
int z,u;
while(m--)
{
scanf("%d",&z);
if(z==)
{
scanf("%d%d",&opl,&opr);
u=opr-opl+;
totx=; toty=; totxy=; totxx=;
query();
px=totx/u;
py=toty/u;
fz=totxy-totx*py-px*toty+px*py*u;
fm=totxx-totx*px*+px*px*u;
ans=fz/fm;
printf("%.10lf\n",ans);
}
else if(z==)
{
scanf("%d%d",&opl,&opr);
scanf("%lf%lf",&s,&t);
add();
}
else
{
scanf("%d%d",&opl,&opr);
scanf("%lf%lf",&s,&t);
change2();
}
}
return ;
}

SDOI2017 相关分析的更多相关文章

  1. BZOJ4817 SDOI2017 相关分析

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

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

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

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

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

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

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

  5. [Luogu 3707] SDOI2017 相关分析

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

  6. 4821: [Sdoi2017]相关分析

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

  7. P3707 [SDOI2017]相关分析

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

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

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

  9. 【BZOJ4821】[Sdoi2017]相关分析 线段树

    [BZOJ4821][Sdoi2017]相关分析 Description Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. ...

  10. (WA)BZOJ 4821: [Sdoi2017]相关分析

    二次联通门 : BZOJ 4821: [Sdoi2017]相关分析 2017.8.23 Updata 妈妈!!这道题卡我!!!就是不然我过!!!!! #include <cstdio> # ...

随机推荐

  1. Gedit : 我的开场白 [TPLY]

    为什么用Gedit 在学校的高一新生里,好像就只有我使用Gedit 大家都笑我是"用记事本编程的人" 我就想 到考场看看你们笑得出来不 先放一个高配emacs配置 (global- ...

  2. UVa11426 最大公约数之和(正版)

    题面 求\(\sum_{i=1}^{n-1}\sum_{j=i+1}^{n}gcd(i, j)\) n<=4000000,数据组数T<=100 答案保证在64位带符号整数范围内(long ...

  3. Nginx负载均衡——基础功能

    熟悉Nginx的小伙伴都知道,Nginx是一个非常好的负载均衡器.除了用的非常普遍的Http负载均衡,Nginx还可以实现Email,FastCGI的负载均衡,甚至可以支持基于Tcp/UDP协议的各种 ...

  4. JAVA通过COM接口操作PPT

    一. 背景说明 在Eclipse环境下,开发JAVA代码操作PPT,支持对PPT模板的修改.包括修改文本标签.图表.表格.满足大多数软件生成PPT报告的要求,即先收工创建好模板,在程序中修改模板数据. ...

  5. 安装paramiko

    前记: 各种奇葩事情都让我遇上了... 1.准备: 1>需要安装python 2>需要安装PyCrypto 2.安装python---省略 3.安装PyCrypto 1>检查pyth ...

  6. [.Net Core] 简单使用 Mvc 内置的 Ioc(续)

    简单使用 Mvc 内置的 Ioc(续) 本文基于 .NET Core 2.0. 上一章<[.Net Core] 简单使用 Mvc 内置的 Ioc>已经对日常 Mvc 中的 Ioc 的简单用 ...

  7. Open Live Writer

    最近突然发现我的CSDN博客里面的很多内容都被删除了,虽然我没有用CSDN写博了,不过还是想到可能我现在用的博客园写博,如果有些内容敏感的话会不会也会被删除文章或者关掉我的博客.心里满是担心,于是想说 ...

  8. Ext简单demo示例

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  9. Flume搭建

    [root@hadoop01 src]# mkdir flume [root@hadoop01 src]# ll 总用量 0 drwxr-xr-x. 2 root root  6 4月   7 201 ...

  10. MongoDb进阶实践之一 如何在Linux(CentOS 7)上安装MongoDB

    一.NoSQL数据简介         1.NoSQL概念                   NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",是 ...