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*];
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 相关分析的更多相关文章
- BZOJ4817 SDOI2017 相关分析
4821: [Sdoi2017]相关分析 Time Limit: 10 Sec Memory Limit: 128 MBSec Special Judge Description Frank对天文 ...
- [Sdoi2017]相关分析 [线段树]
[Sdoi2017]相关分析 题意:沙茶线段树 md其实我考场上还剩一个多小时写了40分 其实当时写正解也可以吧1h也就写完了不过还要拍一下 正解代码比40分短2333 #include <io ...
- [题目] Luogu P3707 [SDOI2017]相关分析
参考资料:[Luogu 3707] SDOI2017 相关分析 P3707 [SDOI2017]相关分析 TFRAC FRAC DFRAC \(\tfrac{\sum}{1}\) \(\frac{\s ...
- 【BZOJ4821】[SDOI2017]相关分析(线段树)
[BZOJ4821][SDOI2017]相关分析(线段树) 题面 BZOJ 洛谷 题解 看看询问要求的东西是什么.把所有的括号拆开,不难发现要求的就是\(\sum x,\sum y,\sum xy,\ ...
- [Luogu 3707] SDOI2017 相关分析
[Luogu 3707] SDOI2017 相关分析 前言 Capella 和 Frank 一样爱好天文学. 她常在冬季的夜晚,若有所思地望着东北方上空的五边形中,最为耀眼的一个顶点. 那一抹金黄曾带 ...
- 4821: [Sdoi2017]相关分析
4821: [Sdoi2017]相关分析 链接 分析: 大力拆式子,化简,然后线段树.注意精度问题与爆longlong问题. 代码: #include<cstdio> #include&l ...
- P3707 [SDOI2017]相关分析
P3707 [SDOI2017]相关分析 线段树裸题?但是真的很麻烦QAQ 题目给的式子是什么不用管,大力拆开,就是\(\frac{\sum x_iy_i-\overline xy_i-\overli ...
- AC日记——[SDOI2017]相关分析 洛谷 P3707
[SDOI2017]相关分析 思路: 裸线段树: (玄学ac): 代码: #include <bits/stdc++.h> using namespace std; #define max ...
- 【BZOJ4821】[Sdoi2017]相关分析 线段树
[BZOJ4821][Sdoi2017]相关分析 Description Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. ...
- (WA)BZOJ 4821: [Sdoi2017]相关分析
二次联通门 : BZOJ 4821: [Sdoi2017]相关分析 2017.8.23 Updata 妈妈!!这道题卡我!!!就是不然我过!!!!! #include <cstdio> # ...
随机推荐
- 谈谈MySQL的事务隔离级别
这篇文章能够阐述清楚跟数据库相关的四个概念:事务.数据库读现象.隔离级别.锁机制 一.事务 先来看下百度百科对数据库事务的定义: 作为单个逻辑单元执行一系列操作,要么完全执行,要么完全不执行.事务处理 ...
- [USACO13NOV]没有找零No Change [TPLY]
[USACO13NOV]没有找零No Change 题目链接 https://www.luogu.org/problemnew/show/3092 做题背景 FJ不是一个合格的消费者,不知法懂法用法, ...
- 【BZOJ3670】动物园(KMP算法)
[BZOJ3670]动物园(KMP算法) 题面 BZOJ 题解 神TM阅读理解题 看完题目之后 想暴力: 搞个倍增数组来跳\(next\) 每次暴跳\(next\) 复杂度\(O(Tnlogn)\) ...
- HDU5919:Sequence II
题面 Vjudge Sol 给一个数列,有m个询问,每次问数列[l,r]区间中所有数的第一次出现的位置的中位数是多少,强制在线 主席树 询问区间内不同的数的个数 树上二分找到那个中位数 # inclu ...
- [POI2010]CHO-Hamsters
KMP暴力求出next数组后 实际上是一个最短路问题,floyed搞一搞 然而会TLE 矩阵优化一下即可(倍增floyed) KMP在弱数据下可以AC..正解请看其他人博客 # include < ...
- 【python学习笔记】4.字典:当索引不好用时
[python学习笔记]4.字典:当索引不好用时 字典是python中唯一内建的map类型 创建: key可以为任何不可改变的类型,包括内置类型,或者元组,字符串 通过大括号: phonebook={ ...
- JDK的安装和Java环境变量配置
所需工具:JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
- centos7上修改主机名
centos7上修改主机名 2017-10-09 13:45:17 个人原创,转载请注明,否则追究法律责任 1,临时修改: 和centos5,centos6 一样,重启失效 2,永久修改: 命令: ...
- Filecoin: 影响力容错(PFT)和预期共识(EC)
名字翻译:Power Fault Tolerance-影响力容错 关于这个名字翻译,小编思考了大约2周时间,期间也跟各路技术牛人进行了交流. The Power Fault Tolerance mod ...
- V5.7_UTF8_SP1、SP2---任意前台用户登录(cookie伪造)
漏洞触发点在include/memberlogin.class.php中的MemberLogin类中的登录校验函数 可以看到M_ID参数是由GetNum(GetCookie("DedeUse ...