SDOI2017 相关分析
把两个式子拆开
Σ(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*4]; void up(int k) {tr[k].sumx=tr[k<<1].sumx+tr[k<<1|1].sumx;tr[k].sumy=tr[k<<1].sumy+tr[k<<1|1].sumy;tr[k].xx=tr[k<<1].xx+tr[k<<1|1].xx;tr[k].xy=tr[k<<1].xy+tr[k<<1|1].xy;tr[k].toti=tr[k<<1].toti+tr[k<<1|1].toti;tr[k].toti2=tr[k<<1].toti2+tr[k<<1|1].toti2; } void down(int k) {tr[k<<1].xy+=tr[k].fy*tr[k<<1].sumx+tr[k].fx*tr[k<<1].sumy+tr[k].fx*tr[k].fy*tr[k<<1].siz;tr[k<<1|1].xy+=tr[k].fy*tr[k<<1|1].sumx+tr[k].fx*tr[k<<1|1].sumy+tr[k].fx*tr[k].fy*tr[k<<1|1].siz;tr[k<<1].xx+=tr[k].fx*tr[k<<1].sumx+tr[k].fx*tr[k<<1].sumx+tr[k].fx*tr[k].fx*tr[k<<1].siz;tr[k<<1|1].xx+=tr[k].fx*tr[k<<1|1].sumx+tr[k].fx*tr[k<<1|1].sumx+tr[k].fx*tr[k].fx*tr[k<<1|1].siz;tr[k<<1].sumx+=tr[k<<1].siz*tr[k].fx;tr[k<<1].sumy+=tr[k<<1].siz*tr[k].fy;tr[k<<1|1].sumx+=tr[k<<1|1].siz*tr[k].fx;tr[k<<1|1].sumy+=tr[k<<1|1].siz*tr[k].fy;tr[k<<1].fx+=tr[k].fx;tr[k<<1].fy+=tr[k].fy;tr[k<<1|1].fx+=tr[k].fx;tr[k<<1|1].fy+=tr[k].fy;tr[k].fx=tr[k].fy=0; } void down2(int k) {tr[k<<1].sumx=tr[k].tagx*tr[k<<1].siz+tr[k<<1].toti;tr[k<<1|1].sumx=tr[k].tagx*tr[k<<1|1].siz+tr[k<<1|1].toti;tr[k<<1].sumy=tr[k].tagy*tr[k<<1].siz+tr[k<<1].toti;tr[k<<1|1].sumy=tr[k].tagy*tr[k<<1|1].siz+tr[k<<1|1].toti;tr[k<<1].xy=tr[k].tagx*tr[k].tagy*tr[k<<1].siz+tr[k<<1].toti*(tr[k].tagx+tr[k].tagy)+tr[k<<1].toti2;tr[k<<1|1].xy=tr[k].tagx*tr[k].tagy*tr[k<<1|1].siz+tr[k<<1|1].toti*(tr[k].tagx+tr[k].tagy)+tr[k<<1|1].toti2;tr[k<<1].xx=tr[k].tagx*tr[k].tagx*tr[k<<1].siz+tr[k<<1].toti*tr[k].tagx*2+tr[k<<1].toti2;tr[k<<1|1].xx=tr[k].tagx*tr[k].tagx*tr[k<<1|1].siz+tr[k<<1|1].toti*tr[k].tagx*2+tr[k<<1|1].toti2;tr[k<<1].tagx=tr[k].tagx; tr[k<<1|1].tagx=tr[k].tagx;tr[k<<1].tagy=tr[k].tagy;tr[k<<1|1].tagy=tr[k].tagy;tr[k<<1].v=tr[k<<1|1].v=true;tr[k].tagx=tr[k].tagy=tr[k].v=0;tr[k<<1].fx=tr[k<<1].fy=0;tr[k<<1|1].fx=tr[k<<1|1].fy=0; } void build(int k,int l,int r) {tr[k].l=l; tr[k].r=r; tr[k].siz=r-l+1; 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>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,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>>1;if(opl<=mid) query(k<<1);if(opr>mid) query(k<<1|1); } 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>>1;if(opl<=mid) add(k<<1);if(opr>mid) add(k<<1|1);up(k); } void change2(int k) {if(tr[k].l>=opl&&tr[k].r<=opr){tr[k].fx=tr[k].fy=0;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*2+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>>1;if(opl<=mid) change2(k<<1);if(opr>mid) change2(k<<1|1);up(k); } int main() {scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%lf",&x[i]);for(int i=1;i<=n;i++) scanf("%lf",&y[i]);build(1,1,n);int z,u;while(m--){scanf("%d",&z);if(z==1){scanf("%d%d",&opl,&opr);u=opr-opl+1;totx=0; toty=0; totxy=0; totxx=0;query(1);px=totx/u;py=toty/u;fz=totxy-totx*py-px*toty+px*py*u;fm=totxx-totx*px*2+px*px*u;ans=fz/fm;printf("%.10lf\n",ans);}else if(z==2){scanf("%d%d",&opl,&opr);scanf("%lf%lf",&s,&t);add(1);}else{scanf("%d%d",&opl,&opr);scanf("%lf%lf",&s,&t);change2(1);}}return 0; }
转载于:https://www.cnblogs.com/TheRoadToTheGold/p/6701784.html
SDOI2017 相关分析相关推荐
- BZOJ.4821.[SDOI2017]相关分析(线段树)
BZOJ LOJ 洛谷 恶心的拆式子..然后就是要维护\(\sum x_i,\ \sum y_i,\ \sum x_iy_i,\ \sum x_i^2\). 操作三可以看成初始化一遍,然后同操作二. ...
- 【BZOJ4821】【SDOI2017】相关分析 [线段树]
相关分析 Time Limit: 10 Sec Memory Limit: 128 MB [Submit][Status][Discuss] Description Frank对天文学非常感兴趣,他 ...
- LOJ刷题记录:2000-2005(SDOI2017)
LOJ刷题记录:2000-2005(SDOI2017) 立一个flag-loj不跳题刷题233 loj2000. 「SDOI2017」数字表格 求: ∏1≤i≤n∏1≤j≤mf(gcd(i,j)) \ ...
- 二分类变量相关性分析spss_spss:两个有序分类变量的相关分析『kendallstau-b相关系数』...
SPSS :两个有序分类变量的相关分析 『 Kendall''''s tau-b 相关系数』 一.问题与数据 某研究者开展了一项人们对税收看法的调查,拟调查人们对 "本国税收过高" ...
- 相关分析在微生物生态学中的应用与误用
摘要 生物信息学分析流程中常包含相关分析,用于推断分类单元之间的相互作用.我们重点强调了使用协方差分析和推荐方法分析相互作用的误区,研究了设计考量因素和改进高通量数据相互作用分析的其他数据类型.结论表 ...
- [Sdoi2017]硬币游戏 [高斯消元 KMP]
[Sdoi2017]硬币游戏 题意:硬币序列,H T等概率出现,\(n \le 300\)个人猜了一个长为$ m \le 300$的字符串,出现即获胜游戏结束.求每个人获胜概率 考场用了[1444: ...
- python实现案例_基于Python实现相关分析案例
节选自<Python预测之美:数据分析与算法实战>. 相关关系是一种非确定的关系,就好像身高与体重的关系一样,它们之间不能用一个固定的函数关系来表示.而相关分析就是研究这种随机变量间相关关 ...
- 【SDOI2017】天才黑客
[SDOI2017]天才黑客 这题太神了. 先模Claris 大神的题解. 首先我们要将边转换为点.如果暴力连边就会有\(m^2\)的边,于是我们考虑优化建图. 难点在于快速得到两个边的串的\(lcp ...
- 【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)
[BZOJ4820][SDOI2017]硬币游戏(高斯消元) 题面 BZOJ 洛谷 题解 第一眼的感觉就是构\(AC\)自动机之后直接高斯消元算概率,这样子似乎就是\(BZOJ1444\)了.然而点数 ...
- 数据分析(排序,数据特征、平均数、方差等,累计统计,相关分析)
# hanbb # come on!!! import pandas as pd import numpy as np import matplotlib.pyplot as pltdf = pd.D ...
最新文章
- 小学生们在B站讲算法,网友:我只会阿巴阿巴
- 如何让关键词进入百度相关搜索列表?
- Leetcode295 数据流中的中位数-最小堆和最大堆
- 二值mask图像 + RGB原图 生成可视化分割结果; 从二值mask获取分割轮廓点
- Unity3d与android通信
- Flex与.NET互操作(二):基于WebService的数据访问(上)
- html中的点击事件
- SAP C4C客户主数据重复检查和清洗实现
- Python 3实现k-邻近算法以及 iris 数据集分类应用
- 终于把结婚照片做成了MTV
- 芯片5nm和7nm有什么差别?CPU已经很小了,可以做大点吗?
- HTTP之一:http协议简介(3)
- Duplicate spring bean id
- cad相对坐标快捷键_cad相对坐标怎么输入?CAD中输入西安80坐标绘图的教程
- php与sap系统,sap系统是什么意思
- mfc入门程序之简单的计算器
- ajax日期格式,ajax读取的日期的格式转换
- 跑跑卡丁车道具攻与防
- [安全攻防进阶篇] 五.逆向分析之Win32 API获取及加解密目录文件、OllyDbg逆向其原理
- 加载插件Apk中的类
热门文章
- python安装graphviz和pydotplus
- 矩阵论作业13,14,15讲
- 类的加载器ClassLoader及其示例
- 潜龙号开启水下机器人_揭秘我国自主水下机器人“潜龙二号”
- 计算机文化基础考试 名词解释,《计算机文化基础》模拟试卷.doc
- qt 展开指定目录_Qt5实战003:Qt Creator工程目录浅析
- oracle dba_tables degree default,oracle中如何将表的并行度设定为DEFAULT?如下:
- 教师计算机培训心得体会范文,教师计算机教育培训学习心得体会
- 浅谈MySQL存储引擎
- mysql数据库的索引及优化小技巧!