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> # ...
随机推荐
- A Dream (PKUWC 2018)
A Dream (PKUWC 2018) 这是一个梦. 从没有几分节日气氛的圣诞,做到了大雪纷飞的数九寒天. 忘了罢! 不记得时间,不记得地点.随着记忆的褪去,一切也只会不复存在. Day-34? D ...
- 清橙A1212:剪枝
题面 清橙 Sol 一种新的树上\(DP\)姿势 从左往右按链\(DP\) 做法: 维护两个栈\(S1\),\(S2\) \(S1\)存当前的链 \(S2\)存分叉点以下要改的链 \(Dfs\),弄一 ...
- java输出日志
protected final Logger logger = Logger.getLogger(User.class); logger.info("在控制台中打印的内容");
- ssr panel魔改前端登陆面板配置邮件服务
1.注册 打开mailgun官网http://www.mailgun.com/ (昨天他反应打开比较慢,所以你得有点耐心,或者跟换你的DNS试试) QQ截图20140731095618.png 点 ...
- 【learning】kd-tree
吐槽 kd-tree这个东西很早就听说过了但是qwq一直没有去了解 (原因的话..啊哈哈听说是什么跟二维平面之类的东西有关的所以就怂掉了qwq没错就是怂qwq) 但其实好像..真的很暴力啊qwq知道思 ...
- error:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
问题:mysql中id存的是int(10),java代码中的id为long,转不过去 解决:mysql中的int要是需要转到java中的long,需要选择unsigned这个选项,即if(unsign ...
- 两种插入排序算法java实现
两种方法都编译运行通过,可以当做排序类直接使用. 折半插入排序: public class Sort1 { public static void main(String[] args) { Inser ...
- html2canvas不能识别svg的解决方案
最新有个功能需要截取网页成图片,于是用到比较流行的html2canvas,本来以为能顺顺利利的搞定,后来发现网页上的流程图连接线不在截图中.于是各种百度.bing,也搜到好多,但是感觉没有一个完整的代 ...
- autobase之配置文件
配置文件内容: 1.db_info{},数据库链接属性,包括Oracle,dmdb,快立方 2.credit etc目录的路径 3.批量基础数据导入sql路径 4.用例执行日志存储目录路径 功能: 1 ...
- WordPress制作圆形头像友情链接页面的方法
网上看见过很多种友情链接页面,我比较喜欢的是圆形头像的这种,先看看效果吧:传送门 就是这种上面是圆形的友链用户头像,下面是友链用户网站名,然后鼠标移上去头像会旋转,怎么实现这种效果呢?我在网上找了很多 ...