来自FallDream的博客,未经允许,请勿转载,谢谢。


Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度、颜色等等,进而估算出星星的距离,半径等等。Frank不仅喜欢观测,还喜欢分析观测到的数据。他经常分析两个参数之间(比如亮度和半径)是否存在某种关系。现在Frank要分析参数X与Y之间的关系。他有n组观测数据,第i组观测数据记录了x_i和y_i。他需要一下几种操作1 L,R:用直线拟合第L组到底R组观测数据。用xx表示这些观测数据中x的平均数,用yy表示这些观测数据中y的平均数,即
xx=Σx_i/(R-L+1)(L<=i<=R)
yy=Σy_i/(R-L+1)(L<=i<=R)
如果直线方程是y=ax+b,那么a应当这样计算:
a=(Σ(x_i-xx)(y_i-yy))/(Σ(x_i-xx)(x_i-xx)) (L<=i<=R)
你需要帮助Frank计算a。
2 L,R,S,T:Frank发现测量数据第L组到底R组数据有误差,对每个i满足L <= i <= R,x_i需要加上S,y_i需要加上T。
3 L,R,S,T:Frank发现第L组到第R组数据需要修改,对于每个i满足L <= i <= R,x_i需要修改为(S+i),y_i需要修改为(T+i)。
 
展开式子,答案是
$\frac{\sum(xiyi -xyi - yxi + xy)}{\sum (xi^{2} -2xxi + x^{2})}$
所以维护区间的x,y,xy的和就行了。
x^2维不维护比较随意。
计算记得用longdouble  不然会爆掉
#include<iostream>
#include<cstdio>
#define MN 100000
#define ld long double
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} struct data{ld x,y,sqx,xy;
friend data operator + (data a,data b)
{
return (data){a.x+b.x,a.y+b.y,a.sqx+b.sqx,a.xy+b.xy};
}
}res;
struct Mark{int op,s,t;}M[MN+];
struct Tree{int l,r,tag;ld s,t;data x;}T[MN*+];
int n,m,X[MN+],Y[MN+],tms=;
void build(int x,int l,int r)
{
if((T[x].l=l)==(T[x].r=r))
{
T[x].x=(data){X[l],Y[l],(ld)X[l]*X[l],(ld)X[l]*Y[l]};
return;
}
int mid=l+r>>;
build(x<<,l,mid);build(x<<|,mid+,r);
T[x].x=T[x<<].x+T[x<<|].x;
}
inline ld Sum(int x){return (ld)x*(x+)/;}
inline ld Sqr(int x){return (ld)x*(x+)*(*x+)/;}
void _Mark(int x,int op,int s,int t)
{
if(op==){T[x].tag=;T[x].s=s;T[x].t=t;}
else if(T[x].tag) T[x].s+=s,T[x].t+=t;
else T[x].tag=,T[x].s=s,T[x].t=t;
if(op==)
{
T[x].x.sqx+=(ld)*s*T[x].x.x+(ld)(T[x].r-T[x].l+)*s*s;
T[x].x.xy+=(ld)s*T[x].x.y+(ld)t*T[x].x.x+(ld)(T[x].r-T[x].l+)*s*t;
T[x].x.x+=(ld)(T[x].r-T[x].l+)*s;
T[x].x.y+=(ld)(T[x].r-T[x].l+)*t;
}
else
{
T[x].x.x=Sum(T[x].r)-Sum(T[x].l-)+(ld)(T[x].r-T[x].l+)*s;
T[x].x.y=Sum(T[x].r)-Sum(T[x].l-)+(ld)(T[x].r-T[x].l+)*t;
T[x].x.sqx=(ld)(T[x].r-T[x].l+)*s*s+Sqr(T[x].r)-Sqr(T[x].l-)+(ld)*s*(Sum(T[x].r)-Sum(T[x].l-));
T[x].x.xy=(ld)(T[x].r-T[x].l+)*s*t+(ld)(s+t)*(Sum(T[x].r)-Sum(T[x].l-))+Sqr(T[x].r)-Sqr(T[x].l-);
}
} void pushdown(int x)
{
if(T[x].tag)
{
int l=x<<,r=l|;
_Mark(l,T[x].tag,T[x].s,T[x].t);
_Mark(r,T[x].tag,T[x].s,T[x].t);
T[x].tag=;
}
} void Modify(int x,int l,int r,int op)
{
if(T[x].l==l&&T[x].r==r)
{
_Mark(x,M[op].op,M[op].s,M[op].t);
return;
}
pushdown(x);
int mid=T[x].l+T[x].r>>;
if(r<=mid) Modify(x<<,l,r,op);
else if(l>mid) Modify(x<<|,l,r,op);
else Modify(x<<,l,mid,op),Modify(x<<|,mid+,r,op);
T[x].x=T[x<<].x+T[x<<|].x;
} void Query(int x,int l,int r)
{
if(T[x].l==l&&T[x].r==r){res=res+T[x].x;return;}
pushdown(x);
int mid=T[x].l+T[x].r>>;
if(r<=mid) Query(x<<,l,r);
else if(l>mid) Query(x<<|,l,r);
else Query(x<<,l,mid),Query(x<<|,mid+,r);
} main()
{
n=read();m=read();
for(int i=;i<=n;++i)X[i]=read();
for(int i=;i<=n;++i)Y[i]=read();
build(,,n);
for(int i=;i<=m;++i)
{
int op=read(),l=read(),r=read();
if(op==)
{
res=(data){,,,};Query(,l,r);
ld _x=(ld)res.x/(r-l+),_y=(ld)res.y/(r-l+);
ld u=res.xy-_x*res.y-_y*res.x+_x*_y*(r-l+);
ld d=res.sqx-*_x*res.x+_x*_x*(r-l+);
printf("%.8lf\n",(double)u/(double)d);
}
else
{
int s=read(),t=read();
M[i]=(Mark){op,s,t};
Modify(,l,r,i);
}
}
return ;
}

[bzoj4821][Sdoi2017]相关分析的更多相关文章

  1. BZOJ4821 SDOI2017相关分析(线段树)

    纯粹的码农题.维护x的和.y的和.xy的和.x2的和即可.可能会炸long long. #include<iostream> #include<cstdio> #include ...

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

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

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

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

  4. BZOJ4817 SDOI2017 相关分析

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

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

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

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

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

  7. [Luogu 3707] SDOI2017 相关分析

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

  8. 4821: [Sdoi2017]相关分析

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

  9. P3707 [SDOI2017]相关分析

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

随机推荐

  1. 使用Github pages+jekyll搭建自己的博客(windows版)

    最近突发奇想,想试试GitHub pages来搭建博客.网上一搜一大堆,嗯...看来还是挺简单的...于是自己撸起袖子干...... 结果对于我这种GitHub注册过,git 没用过,ruby.jek ...

  2. c++ 中lambda

    C++ 11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作. 1.Lambda表达式完整的声明格式如下: [capture list] (params list) mutable  ...

  3. JAVA_SE基础——16.方法

    接触过C语言的同学,这小章节很容易接受.Java中的方法是类似与C语言中的函数  功能和调用方法都类似  只不过叫法不一样  因为java是面向对象  c是面向过程    仅仅是叫法不同.. . 看到 ...

  4. 关于网页设计的css+html相对定位和决定定位的理解

    css中有很多定位,其中最重要的是相对定位和绝对定位: 定位很重要,不搞好,网页就会很乱,显示的完全不是自己想要的效果,自己必须掌握: 首先说一个重要的结论:绝对定位,是不占位置的,总是相对离自己最近 ...

  5. SLF4J - 借助SLF4J, 统一适配所有日志实现为logback日志实现的实践

    一.屏蔽各种日志实现,去掉各种日志实现的实现依赖 二.引入slf4j和各种日志实现的适配器 1.引入slf4j 2.引入各种日志实现的适配器(适配到slf4j) 3.引入logback 引入logba ...

  6. SpringBoot(六):springboot热部署

    在j2ee项目开发中,热部署插件是JRebel.JRebel的使用为开发人员带来了极大的帮助,且挺高了开发便捷.而在SpringBoot开发生态环境中,SpringBoot热部署常用插件是:sprin ...

  7. Chrome浏览器vue-devtools插件安装教程

    1.打开https://github.com/vuejs/vue-devtools,cmd方式直接输入:git Clone https://github.com/vuejs/vue-devtools. ...

  8. flask开发用户管理系统wtf版

    #coding=utf-8 from flask import Flask from flask import request from flask import redirect from flas ...

  9. Java8-Collect收集Stream

    Collection, Collections, collect, Collector, Collectos Collection是Java集合的祖先接口. Collections是java.util ...

  10. 顺序或者说优先级的重要性---解决dom生成问题有感

    我们的大脑有逻辑,程序也有逻辑,只要一切都刚刚好,那么我们大脑的逻辑和程序的逻辑是没有冲突的:但是,有时候,我们想当然,只顾自己头脑中的逻辑,而随意臆想程序的逻辑,这个时候,就会有很多我们觉得不可思议 ...