【BZOJ4821】【SDOI2017】相关分析 [线段树]
相关分析
Time Limit: 10 Sec Memory Limit: 128 MB
[Submit][Status][Discuss]
Description
xx=Σx_i/(R-L+1)(L<=i<=R)
Input
Output
Sample Input
1 2 3
1 2 3
1 1 3
2 2 3 -3 2
1 1 2
3 1 2 2 1
1 1 3
Sample Output
-1.5000000000
-0.6153846154
HINT
Main idea
维护一个线性回归方程,需要支持区间加,区间覆盖等差数列。
Solution
我们先化一个式子:

然后就只要运用线段树维护 Σx Σy Σxx Σxy 就可以了。
每一个具体怎么维护的话,就是把式子列出来,暴力展开一下看一下其中的关联即可,并不难(BearChild懒得写啦!)。
Code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long s64; const int ONE = ; int n,m,P;
int L,R,S,T;
double Sumsq[ONE];
double Vx[ONE],Vy[ONE]; struct power
{
double sumx,sumy,sumxx,sumxy;
double addx,addy;
double covx,covy;
bool cov;
}Node[ONE*]; struct ans
{
double x,y,xx,xy;
}res; inline int get()
{
int res=,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} void Covers(int i,int l,int r,double S,double T)
{
if(l > r) return;
double len = r-l+; double sum = (l+r)*len/;
Node[i].addx = Node[i].addy = ;
Node[i].covx = S; Node[i].covy = T;
Node[i].cov = ;
Node[i].sumxx = S*S*len + sum*S + sum*S + Sumsq[r] - Sumsq[l-];
Node[i].sumxy = S*T*len + sum*S + sum*T + Sumsq[r] - Sumsq[l-];
Node[i].sumx = (S+l + S+r)*len / ;
Node[i].sumy = (T+l + T+r)*len / ;
} void PC(int i,int l,int r)
{
if(Node[i].cov)
{
int mid = l+r>>;
Covers(i<<,l,mid, Node[i].covx,Node[i].covy);
Covers(i<<|,mid+,r, Node[i].covx,Node[i].covy);
Node[i].cov = ;
}
} void Update(int i,int l,int r,double S,double T)
{
if(l > r) return;
PC(i,l,r);
double len = r-l+;
Node[i].addx += S; Node[i].addy += T;
Node[i].sumxx += *S*Node[i].sumx + S*S*len;
Node[i].sumxy += S*Node[i].sumy + T*Node[i].sumx + S*T*len;
Node[i].sumx += S*len; Node[i].sumy += T*len;
} void PU(int i,int l,int r)
{
if(Node[i].addx || Node[i].addy)
{
int mid = l+r>>;
Update(i<<,l,mid, Node[i].addx,Node[i].addy);
Update(i<<|,mid+,r, Node[i].addx,Node[i].addy);
Node[i].addx = Node[i].addy = ;
}
} void pushdown(int i,int l,int r)
{
PU(i,l,r); PC(i,l,r);
} void Renew(int i)
{
int a = i<<, b = i<<|;
Node[i].sumx = Node[a].sumx + Node[b].sumx;
Node[i].sumy = Node[a].sumy + Node[b].sumy;
Node[i].sumxx = Node[a].sumxx + Node[b].sumxx;
Node[i].sumxy = Node[a].sumxy + Node[b].sumxy;
} void Build(int i,int l,int r)
{
if(l==r)
{
Node[i].sumx = Vx[l];
Node[i].sumy = Vy[l];
Node[i].sumxx = (double)Vx[l] * Vx[l];
Node[i].sumxy = (double)Vx[l] * Vy[l];
return;
}
int mid = l+r>>;
Build(i<<,l,mid); Build(i<<|,mid+,r);
Renew(i);
} void Cov(int i,int l,int r,int L,int R,double S,double T)
{
if(L<=l && r<=R)
{
Covers(i,l,r,S,T);
return;
} pushdown(i,l,r);
int mid = l+r>>;
if(L<=mid) Cov(i<<,l,mid,L,R,S,T);
if(mid+<=R) Cov(i<<|,mid+,r,L,R,S,T);
Renew(i);
} void Add(int i,int l,int r,int L,int R,double S,double T)
{
if(L<=l && r<=R)
{
Update(i,l,r,S,T);
return;
} pushdown(i,l,r);
int mid = l+r>>;
if(L<=mid) Add(i<<,l,mid,L,R,S,T);
if(mid+<=R) Add(i<<|,mid+,r,L,R,S,T);
Renew(i);
} void Query(int i,int l,int r,int L,int R)
{
if(L<=l && r<=R)
{
res.x += Node[i].sumx; res.y += Node[i].sumy;
res.xx += Node[i].sumxx; res.xy += Node[i].sumxy;
return;
} pushdown(i,l,r);
int mid = l+r>>;
if(L<=mid) Query(i<<,l,mid,L,R);
if(mid+<=R) Query(i<<|,mid+,r,L,R);
} int main()
{
for(int i=;i<=ONE-;i++) Sumsq[i] = Sumsq[i-] + (double)i*i; n=get(); m=get();
for(int i=;i<=n;i++) Vx[i]=get();
for(int i=;i<=n;i++) Vy[i]=get();
Build(,,n); while(m--)
{
P = get(); L = get(); R = get();
if(P == )
{
res.x = res.y = res.xx = res.xy = ;
Query(,,n,L,R);
double len = R-L+;
double Avex = res.x / len;
double Avey = res.y / len;
printf("%.6lf\n", (res.xy - len * Avex * Avey) / (res.xx - len*Avex*Avex));
}
else
{
S = get(); T = get();
if(P == ) Add(,,n, L,R,S,T);
else Cov(,,n, L,R,S,T);
}
}
}
【BZOJ4821】【SDOI2017】相关分析 [线段树]的更多相关文章
- 【BZOJ4821】[Sdoi2017]相关分析 线段树
[BZOJ4821][Sdoi2017]相关分析 Description Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. ...
- [Sdoi2017]相关分析 [线段树]
[Sdoi2017]相关分析 题意:沙茶线段树 md其实我考场上还剩一个多小时写了40分 其实当时写正解也可以吧1h也就写完了不过还要拍一下 正解代码比40分短2333 #include <io ...
- BZOJ 4821 [Sdoi2017]相关分析 ——线段树
打开题面,看到许多$\sum$ woc,好神啊,SDOI好强啊 然后展开之后,woc,SDOI好弱啊,怎么T3出个线段树裸题啊. 最后写代码的时候,woc,SDOI怎么出个这么码农的题啊,怎么调啊. ...
- 洛谷P3707 [SDOI2017]相关分析(线段树)
题目描述 Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. Frank不仅喜欢观测,还喜欢分析观测到的数据.他经常分析两个 ...
- BZOJ 4821: [Sdoi2017]相关分析 线段树 + 卡精
考试的时候切掉了,然而卡精 + 有一个地方忘开 $long long$,完美挂掉 $50$pts. 把式子化简一下,然后直接拿线段树来维护即可. Code: // luogu-judger-enabl ...
- BZOJ.4821.[SDOI2017]相关分析(线段树)
BZOJ LOJ 洛谷 恶心的拆式子..然后就是要维护\(\sum x_i,\ \sum y_i,\ \sum x_iy_i,\ \sum x_i^2\). 操作三可以看成初始化一遍,然后同操作二. ...
- SDOI2017相关分析 线段树
题目 https://loj.ac/problem/2005 思路 \[ \sum_{L}^{R}{(x_i-x)^{2}} \] \[ \sum_{L}^{R}{(x_i^2-2*x_i*x+x^{ ...
- luogu3707 相关分析 (线段树)
把式子展开以后会发现,可以用线段树维护$x,y,x*y,x^2$分别的区间和 然后操作有区间加和区间修改 这个pushdown的时候,如果改和加的标记同时存在,那一定是先改再加,要不然加的标记已经被清 ...
- BZOJ4821 SDOI2017相关分析(线段树)
纯粹的码农题.维护x的和.y的和.xy的和.x2的和即可.可能会炸long long. #include<iostream> #include<cstdio> #include ...
随机推荐
- 由作业题引发对C++引用的一些思考
首先分析一段代码: #include <bits/c++config.h> #include <ostream> #include <iostream> #incl ...
- 计算器软件实现系列(五)策略模式+asp.net
一 策略模式代码的编写 using System; using System.Collections.Generic; using System.Linq; using System.Web; /// ...
- lintcode-160-寻找旋转排序数组中的最小值 II
160-寻找旋转排序数组中的最小值 II 假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2). 你需要找到其中最小的元素. 数组中可能存在 ...
- IDEA编译的JAR包运行出现“没有主清单属性”
运行编译好的包出现: 解决方案就是: 确保MANIFEST.MF文件在src/main/resources/META_INF/而不是src/main/java/META_INF/
- VMbox复制虚拟机后网卡问题-bring up interface eth0:Device eth0 does not seem to be present
1.使用 ifconfig -a 查看mac地址 eg:HWaddr:08:00:29:B2:2B 2.vi /etc/sysconfig/network-scripts/ifcfg-eth0 将 ...
- GC是什么?为什么要有GC
GC:Garbage Collection 垃圾收集器. GC就是对“不可达“的对象进行回收,释放内存. Java内存的管理实际上就是对对象的管理,其中包括对对象的分配和回收. 对于程序员来说,分配对 ...
- [OS] 操作系统错题集
1. (判断) 答案:错 缓冲区有两块:高速缓存区(物理存在)和磁盘缓存区(逻辑存在,实际是内存一块),都不在外存(硬盘). 2. 操作系统的功能:处理机管理(进程管理).作业管理.存储管理.设备管理 ...
- ConcurrentHashMap弱一致性
[原文链接] 本文将用到Java内存模型的happens-before偏序关系(下文将简称为hb)以及ConcurrentHashMap的底层模型相关的知识.happens-before相关内容参见: ...
- WPF中DataGrid的应用-绑定,增改删,分页,样式
参考以下网址: http://www.cnblogs.com/fwbnet/archive/2012/05/08/2490974.html
- html5 拖拽练习题
html5新的拖拽 只支持Internet Explorer 9.Firefox.Opera 12.Chrome 以及 Safari 5 支持拖放. 来一个实例: <!DOCTYPE html& ...