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> # ...
随机推荐
- SpringBoot集成Shiro并用MongoDB做Session存储
之前项目鉴权一直使用的Shiro,那是在Spring MVC里面使用的比较多,而且都是用XML来配置,用Shiro来做权限控制相对比较简单而且成熟,而且我一直都把Shiro的session放在mong ...
- 【BZOJ2152】聪聪可可(点分治)
[BZOJ2152]聪聪可可(点分治) 题面 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电 ...
- jxl 导出数据到excel
优点: Jxl对中文支持非常好,操作简单,方法看名知意. Jxl是纯javaAPI,在跨平台上表现的非常完美,代码可以再windows或者Linux上运行而无需重新编写 支持Excel 95-2000 ...
- ssh框架中struts.xml 的配置参数详解
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "- ...
- 开发IOS应用真的一定要买苹果电脑设备吗?
不要忘记目的 如果你想开发ios或者苹果的app,网上很多网友都会建议你买一个苹果硬件--苹果电脑,一部分建议你安装黑苹果.这两种方案中前一种费用很高,后一种费时费力(甚至到最后都要转向购买apple ...
- APNS IOS 消息推送沙盒模式和发布模式
在做.NET向IOS设备的App进行消息推送时候,采用的是PushSharp开源类库进行消息的推送,而在开发过程中,采用的是测试版本的app,使用的是测试的p12证书采用的是ApnsConfigura ...
- EXCEL VLOOKUP函数怎么返回多列结果
一般VLOOKUP函数只能返回一列的结果,本例介绍如何一次性返回多列结果. 工具/原料 Excel 函数使用方法说明: 首先,原始数据包括姓名.工号.性别和籍贯信息.现在需要根据姓名同 ...
- 快速创建 HTML5 Canvas 电信网络拓扑图
前言 属性列表想必大家都不会陌生,正常用 HTML5 来做的属性列表大概就是用下拉菜单之类的,而且很多情况下,下拉列表还不够好看,怎么办?我试着用 HT for Web 来实现属性栏点击按钮弹出多功能 ...
- Java测试(一)
关于while和do-while循环,下列说法正确的是 A 两种循环除了格式不同外,功能完全相同 B 与do-while语句不通的是,while语句的循环至少执行一次 C do-while语句首 ...
- C语言第十一次作业--函数嵌套调用
一.实验作业 1.1 PTA题目:递归法对任意10个数据按降序排序 设计思路 定义整型循环变量i,最小值下标min,中间变量t 若n==1,直接返回 否则 min=10-n 最小值下标赋初值 for ...