相关分析 BZOJ 4821
相关分析
【问题描述】
【输入格式】
【输出格式】
对于每个1操作,输出一行,表示直线斜率a。
选手输出与标准输出的绝对误差不超过10^-5即为正确。
【样例输入】
3 5
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
【样例输出】
1.0000000000
-1.5000000000
-0.6153846154
题解:
对于线性回归方程我们把它拆分,x平方和,x权值和,y权值和,xy权值和,x平方和
第二个第三个操作用初中学的完全平方公式拆一拆就好了
记得爆 long long MMP
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
inline void Scan(int &x)
{
char c;
bool o = false;
while(!isdigit(c = getchar()))
if(c == '-')
o = true;
x = c - '';
while(isdigit(c = getchar()))
x = x * + c - '';
if(o) x = -x;
}
const int maxn = 1e5 + ;
const int maxs = maxn << ;
struct ele
{
long long x, y;
double xy, sx;
inline void print()
{
printf("%lf %lf %lf %lf\n", (double) x, (double) y, (double) xy, (double) sx);
}
inline void empty()
{
x = y = xy = sx = ;
}
};
struct tag
{
long long s, t;
inline bool exist()
{
return s || t;
}
inline void empty()
{
s = t = ;
}
};
tag mark[maxs], sign[maxs];
ele ans, add;
ele tr[maxs];
int n, m;
int x[maxn], y[maxn];
double sum[maxn];
inline ele operator + (ele a, ele b)
{
return (ele) {a.x + b.x, a.y + b.y, a.xy + b.xy, a.sx + b.sx};
}
inline tag operator + (tag a, tag b)
{
return (tag) {a.s + b.s, a.t + b.t};
}
void Build(int k, int l, int r)
{
if(l == r)
{
tr[k] = (ele) {x[l], y[l], (double) x[l] * y[l], (double) x[l] * x[l]};
return;
}
int mi = l + r >> ;
int lc = k << , rc = k << | ;
Build(lc, l, mi), Build(rc, mi + , r);
tr[k] = tr[lc] + tr[rc];
}
inline void Add(int k, int n, long long s, long long t)
{
long long x, y;
double xy, sx;
x = n * s;
y = n * t;
xy = (double) s * tr[k].y + (double) t * tr[k].x + (double) n * s * t;
sx = (double) n * s * s + * s * (double) tr[k].x;
add = (ele) {x, y, xy, sx};
tr[k] = tr[k] + add;
mark[k] = mark[k] + (tag) {s, t};
}
inline long long Sum(long long l, long long r, int n)
{
return (l + r) * n / ;
}
inline void Change(int k, double s, double t, int l, int r)
{
int n = r - l + ;
double x, y, xy, sx;
x = Sum(s + l, s + r, n);
y = Sum(t + l, t + r, n);
xy = (double) n * s * t + (double) (s + t) * Sum(l, r, n) + sum[r] - sum[l - ];
sx = (double) n * s * s + sum[r] - sum[l - ] + (double) * s * Sum(l, r, n);
tr[k] = (ele) {x, y, xy, sx};
sign[k] = (tag) {s, t};
mark[k].empty();
}
inline void Down(int k, int l, int r)
{
int lc = k << , rc = k << | ;
int mi = l + r >> ;
double s, t;
if(sign[k].exist())
{
s = sign[k].s, t = sign[k].t;
Change(lc, s, t, l, mi), Change(rc, s, t, mi + , r);
sign[k].empty();
}
if(mark[k].exist())
{
s = mark[k].s, t = mark[k].t;
Add(lc, mi - l + , s, t), Add(rc, r - mi, s, t);
mark[k].empty();
}
}
void Query(int k, int l, int r, int x, int y)
{
if(x <= l && r <= y)
{
ans = ans + tr[k];
return;
}
Down(k, l, r);
int mi = l + r >> ;
if(x <= mi) Query(k << , l, mi, x, y);
if(y > mi) Query(k << | , mi + , r, x, y);
}
void Insert(int k, int l, int r, int x, int y, int s, int t)
{
if(x <= l && r <= y)
{
Add(k, r - l + , s, t);
return;
}
Down(k, l, r);
int mi = l + r >> ;
int lc = k << , rc = k << | ;
if(x <= mi) Insert(lc, l, mi, x, y, s, t);
if(y > mi) Insert(rc, mi + , r, x, y, s, t);
tr[k] = tr[lc] + tr[rc];
}
void Modify(int k, int l, int r, int x, int y, int s, int t)
{
if(x <= l && r <= y)
{
Change(k, s, t, l, r);
return;
}
Down(k, l, r);
int mi = l + r >> ;
int lc = k << , rc = k << | ;
if(x <= mi) Modify(lc, l, mi, x, y, s, t);
if(y > mi) Modify(rc, mi + , r, x, y, s, t);
tr[k] = tr[lc] + tr[rc];
}
int main()
{
Scan(n), Scan(m);
for(int i = ; i <= n; ++i) Scan(x[i]);
for(int i = ; i <= n; ++i) Scan(y[i]);
for(int i = ; i <= n; ++i) sum[i] = sum[i - ] + (double) i * i;
Build(, , n);
int o, x, y, s, t;
int len;
long long meanx;
long double up, down, meany;
while(m--)
{
Scan(o), Scan(x), Scan(y);
switch(o)
{
case :
{
ans.empty();
Query(, , n, x, y);
len = y - x + ;
meanx = ans.x;
meany = (double) ans.y / len;
up = ans.xy - meanx * meany;
down = ans.sx - (double) meanx * meanx / len;
double answer = up / down;
printf("%.10lf\n", answer);
break;
}
case :
{
Scan(s), Scan(t);
Insert(, , n, x, y, s, t);
break;
}
case :
{
Scan(s), Scan(t);
Modify(, , n, x, y, s, t);
break;
}
}
}
}
相关分析 BZOJ 4821的更多相关文章
- (WA)BZOJ 4821: [Sdoi2017]相关分析
二次联通门 : BZOJ 4821: [Sdoi2017]相关分析 2017.8.23 Updata 妈妈!!这道题卡我!!!就是不然我过!!!!! #include <cstdio> # ...
- ●BZOJ 4821 [Sdoi2017]相关分析
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4821 题解: 线段树是真的恶心,(也许是我的方法麻烦了一些吧)首先那个式子可以做如下化简: ...
- BZOJ.4821.[SDOI2017]相关分析(线段树)
BZOJ LOJ 洛谷 恶心的拆式子..然后就是要维护\(\sum x_i,\ \sum y_i,\ \sum x_iy_i,\ \sum x_i^2\). 操作三可以看成初始化一遍,然后同操作二. ...
- bzoj 4821 [Sdoi2017]相关分析
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4821 题解 做法显然 就是维护一颗线段树 里面装4个东西 区间x的和 区间y的和 区间$x^ ...
- BZOJ 4821 [Sdoi2017]相关分析 ——线段树
打开题面,看到许多$\sum$ woc,好神啊,SDOI好强啊 然后展开之后,woc,SDOI好弱啊,怎么T3出个线段树裸题啊. 最后写代码的时候,woc,SDOI怎么出个这么码农的题啊,怎么调啊. ...
- BZOJ 4821: [Sdoi2017]相关分析 线段树 + 卡精
考试的时候切掉了,然而卡精 + 有一个地方忘开 $long long$,完美挂掉 $50$pts. 把式子化简一下,然后直接拿线段树来维护即可. Code: // luogu-judger-enabl ...
- BZOJ 4821 (luogu 3707)(全网最简洁的代码实现之一)
题面 传送门 分析 计算的部分其他博客已经写的很清楚了,本博客主要提供一个简洁的实现方法 尤其是pushdown函数写得很简洁 代码 #include<iostream> #include ...
- 4821: [Sdoi2017]相关分析
4821: [Sdoi2017]相关分析 链接 分析: 大力拆式子,化简,然后线段树.注意精度问题与爆longlong问题. 代码: #include<cstdio> #include&l ...
- BZOJ4817 SDOI2017 相关分析
4821: [Sdoi2017]相关分析 Time Limit: 10 Sec Memory Limit: 128 MBSec Special Judge Description Frank对天文 ...
随机推荐
- 在2d游戏中常用的向量方式
function cc.exports.VectorRotateByAngle(vector,angle)--计算向量旋转后的向量,angle:正数逆时针,负输顺时针 angle = angle*ma ...
- docker镜像下载
获得CentOS的Docker CE 预计阅读时间: 10分钟 要在CentOS上开始使用Docker CE,请确保 满足先决条件,然后 安装Docker. 先决条件 Docker EE客户 要安装D ...
- linux下GPIO的用户层操作(sysfs)
linux的GPIO通过sysfs为用户提供服务,下面是linux kernel里的说明文档,学习一下. GPIO Sysfs Interface for Userspace ============ ...
- 封装,封装的原理,Property ,setter ,deleter,多态,内置函数 ,__str__ , __del__,反射,动态导入模块
1,封装 ## 什么是封装 what 对外隐藏内部的属性,以及实现细节,并给外部提供使用的接口 学习封装的目的:就是为了能够限制外界对内部数据的方法 注意 :封装有隐藏的意思,但不是单纯的隐藏 pyt ...
- HashMap存储原理
1. HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. ...
- shutil,zipfile,tarfile模块
一,shutil模块 1.shutil.chown() shutil.chown('test.txt',user='mysql',group='mysql') #改变文件的属主和属组. 2.shuti ...
- 探讨2018年最受欢迎的15顶级Python库!
近日,数据科学网站 KDnuggets 评选出了顶级 Python 库 Top15,领域横跨数据科学.数据可视化.深度学习和机器学习.如果本文有哪些遗漏,你可以在评论区补充. 图 1:根据 GitHu ...
- selenium2中的TestNg注解和数据驱动的简介及使用
TestNg常用注解介绍,先来张图: 先看一下,以上各个注释的运行次序: @Test 表示的意义: 1.表示示该方法是一个测试方法,在运行时,会自动的运行有@Test注脚的方法. 示例: @Be ...
- UTV - URL Tag Validation
What`s UTV 1.URL Tag Validation 2.Special format of URL for preventing unauthorized usage and access ...
- Python学习-day9 线程
这节内容主要是关于线程的学习 首先要了解的什么是进程,什么是线程 进程与线程 什么是进程(process)? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称 ...