4821: [Sdoi2017]相关分析

Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge

Description

Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度、颜色等等,进而估算出
星星的距离,半径等等。Frank不仅喜欢观测,还喜欢分析观测到的数据。他经常分析两个参数之间(比如亮度和
半径)是否存在某种关系。现在Frank要分析参数X与Y之间的关系。他有n组观测数据,第i组观测数据记录了x_i和
y_i。他需要一下几种操作1 L,R:用直线拟合第L组到底R组观测数据。用xx表示这些观测数据中x的平均数,用yy
表示这些观测数据中y的平均数,即
xx=Σx_i/(R-L+1)(L<=i<=R)
yy=Σy_i/(R-L+1)(L<=i<=R)
如果直线方程是y=ax+b,那么a应当这样计算:
a=(Σ(x_i-xx)(y_i-yy))/(Σ(x_i-xx)(x_i-xx)) (L<=i<=R)
你需要帮助Frank计算a。
2 L,R,S,T:
Frank发现测量数据第L组到底R组数据有误差,对每个i满足L <= i <= R,x_i需要加上S,y_i需要加上T。
3 L,R,S,T:
Frank发现第L组到第R组数据需要修改,对于每个i满足L <= i <= R,x_i需要修改为(S+i),y_i需要修改为(T+i)。

Input

第一行两个数n,m,表示观测数据组数和操作次数。
接下来一行n个数,第i个数是x_i。
接下来一行n个数,第i个数是y_i。
接下来m行,表示操作,格式见题目描述。
1<=n,m<=10^5,0<=|S|,|T|,|x_i|,|y_i|<=10^5
保证1操作不会出现分母为0的情况。

Output

对于每个1操作,输出一行,表示直线斜率a。
选手输出与标准输出的绝对误差不超过10^-5即为正确。

Sample Input

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

Sample Output

1.0000000000
-1.5000000000
-0.6153846154
 
  本来我是不会想起这道题的。但是有这么一个故事:
  开学,学科,数学课,变量的相关性。
  下课后,同学们聚在一起搞事。
  QT:“你记不记得SDOI2017 D2T3 相关分析?”
  我:“……蛤?”
  QT:“题目没给你化简,数学书上化简了。”
  我:“……蛤?”
  QT:“拆开式子之后有4个东西要维护,我不会(想)写。”
  我:“……蛤?”
  …………
  在机房写作业。
  QT:“不行这个数学作业太难算了,我要编程计算。”
  Anson:“你可以打一波SDOI2017 相关分析。”
  QT(虚伪地):“我不会打。”
  然而因为我早已从Jesse那里蒯了一个calc.cpp,作业已经写完了。
  然后我就只是想看看传说中的SDOI2017D2T3是什么题,我是不是忘的一干二净。
  然后发现果然忘得一干二净。
  然后就有了下面的事情。
 
  题解就是显而易见的线段树。
  把式子拆开看,你就会得到:
 
  
  
  上下的后面那一截可以再化简一下。
  然后就只要维护4个东西:
  
  
  
  这个就很simple了吧,线段树嘛。
  对于操作2,3,把前后的式子拆一下,维护一下就好了。
  可以先做codevs的 线段树练习5 思路都是差不多的。
  思维难度:高中数学。
  代码难度:MDZZ。
  PS:这道题就别再codevs交了,它没有SPJ。
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <cstring>
  7. #include <queue>
  8. #include <complex>
  9. #include <stack>
  10. #define LL long long int
  11. #define dob long double
  12. #define ls (x<<1)
  13. #define rs (x<<1|1)
  14. using namespace std;
  15.  
  16. const int N = ;
  17. struct Tree{
  18. dob x,y,xx,xy;
  19. Tree operator +(const Tree &t){
  20. return (Tree){x+t.x,y+t.y,xx+t.xx,xy+t.xy};
  21. }
  22. }Tr[N*];
  23. int n,m,lazy_vis[N];
  24. dob X[N/],Y[N/],lazy_add1[N],lazy_add2[N],lazy_set1[N],lazy_set2[N];
  25.  
  26. inline int gi(){
  27. int x=,res=;char ch=getchar();
  28. while(ch>''||ch<''){if(ch=='-')res*=-;ch=getchar();}
  29. while(ch<=''&&ch>='')x=x*+ch-,ch=getchar();
  30. return x*res;
  31. }
  32.  
  33. inline void build(int x,int l,int r){
  34. if(l==r){
  35. Tr[x]=(Tree){X[l],Y[l],1.0*X[l]*X[l],1.0*X[l]*Y[l]};
  36. return;
  37. }
  38. int mid=(l+r)>>;
  39. build(ls,l,mid);build(rs,mid+,r);
  40. Tr[x]=Tr[ls]+Tr[rs];
  41. }
  42.  
  43. inline dob calc(dob l,dob r){
  44. return 0.5*(l+r)*(r-l+);
  45. }
  46.  
  47. inline dob calcpow(dob l,dob r){
  48. l-=;
  49. dob p1=1.0*(r)*(r+)*(*r+)/6.0;
  50. dob p2=1.0*(l)*(l+)*(*l+)/6.0;
  51. return p1-p2;
  52. }
  53.  
  54. inline void down(int x,int l,int r){
  55. int mid=(l+r)>>,sl=mid-l+,sr=r-mid;
  56. if(lazy_vis[x]){
  57. lazy_add1[ls]=lazy_add1[rs]=lazy_add2[ls]=lazy_add2[rs]=;
  58. lazy_vis[ls]=lazy_vis[rs]=;
  59. dob S=lazy_set1[x],T=lazy_set2[x];
  60. lazy_set1[ls]=lazy_set1[rs]=lazy_set1[x];
  61. lazy_set2[ls]=lazy_set2[rs]=lazy_set2[x];
  62. Tr[ls].xx=1.0*sl*S*S+2.0*S*calc(l,mid)+calcpow(l,mid);
  63. Tr[rs].xx=1.0*sr*S*S+2.0*S*calc(mid+,r)+calcpow(mid+,r);
  64. Tr[ls].xy=1.0*sl*S*T+1.0*(S+T)*calc(l,mid)+calcpow(l,mid);
  65. Tr[rs].xy=1.0*sr*S*T+1.0*(S+T)*calc(mid+,r)+calcpow(mid+,r);
  66. Tr[ls].x=1.0*sl*S+calc(l,mid);Tr[rs].x=1.0*sr*S+calc(mid+,r);
  67. Tr[ls].y=1.0*sl*T+calc(l,mid);Tr[rs].y=1.0*sr*T+calc(mid+,r);
  68. lazy_vis[x]=;
  69. }
  70. if(lazy_add1[x] || lazy_add2[x]){
  71. dob S=lazy_add1[x],T=lazy_add2[x];
  72. lazy_add1[ls]+=S;lazy_add1[rs]+=S;
  73. lazy_add2[ls]+=T;lazy_add2[rs]+=T;
  74. Tr[ls].xx+=2.0*Tr[ls].x*S+1.0*sl*S*S;
  75. Tr[rs].xx+=2.0*Tr[rs].x*S+1.0*sr*S*S;
  76. Tr[ls].xy+=1.0*Tr[ls].x*T+1.0*Tr[ls].y*S+1.0*sl*S*T;
  77. Tr[rs].xy+=1.0*Tr[rs].x*T+1.0*Tr[rs].y*S+1.0*sr*S*T;
  78. Tr[ls].x+=1.0*sl*S;Tr[rs].x+=1.0*sr*S;
  79. Tr[ls].y+=1.0*sl*T;Tr[rs].y+=1.0*sr*T;
  80. lazy_add1[x]=lazy_add2[x]=;
  81. }
  82. }
  83.  
  84. inline Tree query_1(int x,int l,int r,int xl,int xr){
  85. if(xl<=l && r<=xr)return Tr[x];
  86. down(x,l,r);int mid=(l+r)>>;
  87. if(xr<=mid)return query_1(ls,l,mid,xl,xr);
  88. else if(xl>mid)return query_1(rs,mid+,r,xl,xr);
  89. return query_1(ls,l,mid,xl,mid)+query_1(rs,mid+,r,mid+,xr);
  90. }
  91.  
  92. inline void update_2(int x,int l,int r,int xl,int xr,dob S,dob T){
  93. if(xl<=l && r<=xr){
  94. lazy_add1[x]+=S;lazy_add2[x]+=T;
  95. Tr[x].xx+=2.0*Tr[x].x*S+1.0*(r-l+)*S*S;
  96. Tr[x].xy+=1.0*Tr[x].x*T+1.0*Tr[x].y*S+1.0*(r-l+)*S*T;
  97. Tr[x].x+=1.0*(r-l+)*S;Tr[x].y+=1.0*(r-l+)*T;
  98. return;
  99. }
  100. down(x,l,r);int mid=(l+r)>>;
  101. if(xr<=mid)update_2(ls,l,mid,xl,xr,S,T);
  102. else if(xl>mid)update_2(rs,mid+,r,xl,xr,S,T);
  103. else update_2(ls,l,mid,xl,mid,S,T),update_2(rs,mid+,r,mid+,xr,S,T);
  104. Tr[x]=Tr[ls]+Tr[rs];
  105. }
  106.  
  107. inline void update_3(int x,int l,int r,int xl,int xr,dob S,dob T){
  108. if(xl<=l && r<=xr){
  109. lazy_add1[x]=lazy_add2[x]=;
  110. lazy_vis[x]=;lazy_set1[x]=S;lazy_set2[x]=T;
  111. Tr[x].xx=1.0*(r-l+)*S*S+2.0*S*calc(1.0*l,1.0*r)+calcpow(1.0*l,1.0*r);
  112. Tr[x].xy=1.0*(r-l+)*S*T+1.0*(S+T)*calc(l,r)+calcpow(l,r);
  113. Tr[x].x=1.0*(r-l+)*S+calc(l,r);Tr[x].y=1.0*(r-l+)*T+calc(l,r);
  114. return;
  115. }
  116. down(x,l,r);int mid=(l+r)>>;
  117. if(xr<=mid)update_3(ls,l,mid,xl,xr,S,T);
  118. else if(xl>mid)update_3(rs,mid+,r,xl,xr,S,T);
  119. else update_3(ls,l,mid,xl,mid,S,T),update_3(rs,mid+,r,mid+,xr,S,T);
  120. Tr[x]=Tr[ls]+Tr[rs];
  121. }
  122.  
  123. int main()
  124. {
  125. /*freopen(".in","r",stdin);
  126. freopen(".out","w",stdout);*/
  127. n=gi();m=gi();
  128. for(int i=;i<=n;++i)X[i]=gi();
  129. for(int i=;i<=n;++i)Y[i]=gi();
  130. build(,,n);
  131. for(int i=;i<=m;++i){
  132. int type=gi();
  133. if(type==){
  134. int l=gi(),r=gi();
  135. Tree ans=query_1(,,n,l,r);
  136. dob fz=ans.xy-ans.x*ans.y/(r-l+);
  137. dob fm=ans.xx-ans.x*ans.x/(r-l+);
  138. printf("%.10Lf\n",fz/fm);
  139. }
  140. if(type==){
  141. int l=gi(),r=gi(),S=gi(),T=gi();
  142. update_2(,,n,l,r,1.0*S,1.0*T);
  143. }
  144. if(type==){
  145. int l=gi(),r=gi(),S=gi(),T=gi();
  146. update_3(,,n,l,r,1.0*S,1.0*T);
  147. }
  148. }
  149.  
  150. /*fclose(stdin);
  151. fclose(stdout);*/
  152. return ;
  153. }

相关分析

BZOJ4817 SDOI2017 相关分析的更多相关文章

  1. [Sdoi2017]相关分析 [线段树]

    [Sdoi2017]相关分析 题意:沙茶线段树 md其实我考场上还剩一个多小时写了40分 其实当时写正解也可以吧1h也就写完了不过还要拍一下 正解代码比40分短2333 #include <io ...

  2. [题目] Luogu P3707 [SDOI2017]相关分析

    参考资料:[Luogu 3707] SDOI2017 相关分析 P3707 [SDOI2017]相关分析 TFRAC FRAC DFRAC \(\tfrac{\sum}{1}\) \(\frac{\s ...

  3. 【BZOJ4821】[SDOI2017]相关分析(线段树)

    [BZOJ4821][SDOI2017]相关分析(线段树) 题面 BZOJ 洛谷 题解 看看询问要求的东西是什么.把所有的括号拆开,不难发现要求的就是\(\sum x,\sum y,\sum xy,\ ...

  4. [Luogu 3707] SDOI2017 相关分析

    [Luogu 3707] SDOI2017 相关分析 前言 Capella 和 Frank 一样爱好天文学. 她常在冬季的夜晚,若有所思地望着东北方上空的五边形中,最为耀眼的一个顶点. 那一抹金黄曾带 ...

  5. 4821: [Sdoi2017]相关分析

    4821: [Sdoi2017]相关分析 链接 分析: 大力拆式子,化简,然后线段树.注意精度问题与爆longlong问题. 代码: #include<cstdio> #include&l ...

  6. P3707 [SDOI2017]相关分析

    P3707 [SDOI2017]相关分析 线段树裸题?但是真的很麻烦QAQ 题目给的式子是什么不用管,大力拆开,就是\(\frac{\sum x_iy_i-\overline xy_i-\overli ...

  7. AC日记——[SDOI2017]相关分析 洛谷 P3707

    [SDOI2017]相关分析 思路: 裸线段树: (玄学ac): 代码: #include <bits/stdc++.h> using namespace std; #define max ...

  8. 【BZOJ4821】[Sdoi2017]相关分析 线段树

    [BZOJ4821][Sdoi2017]相关分析 Description Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. ...

  9. (WA)BZOJ 4821: [Sdoi2017]相关分析

    二次联通门 : BZOJ 4821: [Sdoi2017]相关分析 2017.8.23 Updata 妈妈!!这道题卡我!!!就是不然我过!!!!! #include <cstdio> # ...

随机推荐

  1. Eclipse创建一个JAVA WEB项目

    继上一篇博客,Eclipse的Tomcat已经配置好了,现在我们开始创建web项目. 1.打开Eclipse,选择菜单栏的file>New>Dynamic Web Project 弹出窗口 ...

  2. php数据分页显示基础

    一:分页原理: 所谓分页显示,也就是将数据库中的结果集认为的分成一段一段的来显示,需要两个初始的参数: 每页多少条记录 ($PageSize)? 当前是第几页($CurrentPageID)? 还有其 ...

  3. 小程序采坑系列-this.setData

    今天踩了大坑,坑里还都是碎瓶渣子.. 先说一下基本使用.官网也有. 比如说你在main.js里面有这些变量.想修改某些值. data: { main_view_bgcolor: "" ...

  4. Caddy服务器搭建和实现文件共享

    1:Caddy介绍 作为新兴 Web 服务器,Caddy 提供了很多简单易用的功能而没有历史的包袱,其默认支持并且能帮你自动配置 HTTP/2.HTTPS,对于 IPV6.WebSockets 都有很 ...

  5. IK-Analyzer(5.3.1)动态配置自定义词典

    参考文献:http://blog.csdn.net/fatpanda/article/details/37911079 jar包: IK-Analyzer-extra-5.3.1.jar IKAnal ...

  6. 整合SSH时,遇到了org.springframework.beans.factory.BeanCreationException错误

    严重: StandardWrapper.Throwableorg.springframework.beans.factory.BeanCreationException: Error creating ...

  7. Netty4.0.24.Final 版本中 IdleStateHandler 使用时的局限性

    使用Netty在客户端和服务端建立通讯通道,一般来说,一个连接可能很久没有访问,由于各种各样的网络问题导致连接已经失效,客户端再次发送请求时会产生连接异常. 基于这个原因,需要在客户端和服务端之间建立 ...

  8. 来个Button看一看

    0.目录 1.前言 2.基本属性与方法 3.点点更健康 4.我的Button有点多 5.震惊!TextView竟然... 1.前言 每次写代码总会忘记一些东西,又要重新Goooooooooogle,好 ...

  9. 【NOIP2015提高组】跳石头

    https://www.luogu.org/problem/show?pid=2678 最小值最大问题,二分答案.每次检查是否能仅移走m块岩石使得所有跳跃距离均大于等于mid. #include &l ...

  10. Python2/3中的urllib库

    urllib库对照速查表 Python2.X Python3.X urllib urllib.request, urllib.error, urllib.parse urllib2 urllib.re ...