分析:

化简一下就行了,注意一下平方和公式的运用以及精度的误差。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn = ;
  5.  
  6. int n,m;
  7.  
  8. int x[maxn],y[maxn];
  9.  
  10. struct node{
  11. int lazx1,lazx2,lazy1,lazy2;
  12. double multi,sumx,sumy,sqr;
  13. }T[maxn<<];
  14.  
  15. long long ump(int l,int r){
  16. return (1ll*r*(r+)*(*r+)-1ll*(l-)*l*(*l-))/;
  17. }
  18.  
  19. void fugai(int now,int tl,int tr,int s,int t){
  20. T[now].lazx2 = T[now].lazy2 = ;
  21. T[now].lazx1 = s; T[now].lazy1 = t;
  22. T[now].sumx = 1ll*((s+tl)+(s+tr))*(tr-tl+)/;
  23. T[now].sumy = 1ll*((t+tl)+(t+tr))*(tr-tl+)/;
  24. T[now].sqr = 1ll*(tr-tl+)*s*s+1ll*s*(tl+tr)*(tr-tl+)+ump(tl,tr);
  25. T[now].multi=1ll*(tr-tl+)*s*t+1ll*(s+t)*(tl+tr)*(tr-tl+)/+ump(tl,tr);
  26. }
  27.  
  28. void add(int now,int tl,int tr,int s,int t){
  29. T[now].lazx2+=s;T[now].lazy2 += t;
  30. T[now].multi+=1ll*s*T[now].sumy+1ll*t*T[now].sumx+1ll*s*t*(tr-tl+);
  31. T[now].sqr +=1ll*s*s*(tr-tl+)+2ll*s*T[now].sumx;
  32. T[now].sumx += 1ll*s*(tr-tl+); T[now].sumy += 1ll*t*(tr-tl+);
  33. }
  34.  
  35. void push_up(int now){
  36. T[now].multi = T[now<<].multi+T[now<<|].multi;
  37. T[now].sumx = T[now<<].sumx+T[now<<|].sumx;
  38. T[now].sumy = T[now<<].sumy+T[now<<|].sumy;
  39. T[now].sqr = T[now<<].sqr+T[now<<|].sqr;
  40. }
  41.  
  42. void push_down1(int now,int tl,int tr){
  43. int mid = (tl+tr)/;
  44. fugai(now<<,tl,mid,T[now].lazx1,T[now].lazy1);
  45. fugai(now<<|,mid+,tr,T[now].lazx1,T[now].lazy1);
  46. T[now].lazx1 = T[now].lazy1 = ;
  47. }
  48.  
  49. void push_down2(int now,int tl,int tr){
  50. int mid = (tl+tr)/;
  51. add(now<<,tl,mid,T[now].lazx2,T[now].lazy2);
  52. add(now<<|,mid+,tr,T[now].lazx2,T[now].lazy2);
  53. T[now].lazx2 = T[now].lazy2 = ;
  54. }
  55.  
  56. void read(){
  57. scanf("%d%d",&n,&m);
  58. for(int i=;i<=n;i++)scanf("%d",&x[i]);
  59. for(int i=;i<=n;i++) scanf("%d",&y[i]);
  60. }
  61.  
  62. node merge(node ai,node bi){
  63. return (node){,,,,ai.multi+bi.multi,ai.sumx+bi.sumx,ai.sumy+bi.sumy,ai.sqr+bi.sqr};
  64. }
  65.  
  66. void build_tree(int now,int l,int r){
  67. if(l == r){
  68. T[now].lazx1 = T[now].lazy1 = ;
  69. T[now].multi = 1ll*x[l]*y[l];
  70. T[now].sumx = x[l];T[now].sumy = y[l];
  71. T[now].sqr = 1ll*x[l]*x[l];
  72. }else{
  73. int mid = (l+r)/;
  74. build_tree(now<<,l,mid);
  75. build_tree(now<<|,mid+,r);
  76. T[now].lazx1 = T[now].lazy1 = ;
  77. push_up(now);
  78. }
  79. }
  80.  
  81. node Query(int now,int tl,int tr,int l,int r){
  82. if(tl >= l && tr <= r){return T[now];}
  83. if(tl > r || tr < l){return (node){,,,,,,,};}
  84. if(T[now].lazx1<=maxn||T[now].lazy1<=maxn) push_down1(now,tl,tr);
  85. if(T[now].lazx2||T[now].lazy2) push_down2(now,tl,tr);
  86. int mid = (tl+tr)/;
  87. node ans = merge(Query(now<<,tl,mid,l,r),Query(now<<|,mid+,tr,l,r));
  88. push_up(now);
  89. return ans;
  90. }
  91.  
  92. void Modify1(int now,int tl,int tr,int l,int r,int s,int t){
  93. if(tl >= l && tr <= r){
  94. add(now,tl,tr,s,t);
  95. return;
  96. }
  97. if(tl > r || tr < l){return;}
  98. if(T[now].lazx1<=maxn||T[now].lazy1<=maxn) push_down1(now,tl,tr);
  99. if(T[now].lazx2||T[now].lazy2) push_down2(now,tl,tr);
  100. int mid = (tl+tr)/;
  101. Modify1(now<<,tl,mid,l,r,s,t);
  102. Modify1(now<<|,mid+,tr,l,r,s,t);
  103. push_up(now);
  104. }
  105.  
  106. void Modify2(int now,int tl,int tr,int l,int r,int s,int t){
  107. if(tl >= l && tr <= r){
  108. fugai(now,tl,tr,s,t);
  109. return;
  110. }
  111. if(tl > r || tr < l){return;}
  112. if(T[now].lazx1<=maxn||T[now].lazy1<=maxn) push_down1(now,tl,tr);
  113. if(T[now].lazx2||T[now].lazy2) push_down2(now,tl,tr);
  114. int mid = (tl+tr)/;
  115. Modify2(now<<,tl,mid,l,r,s,t);
  116. Modify2(now<<|,mid+,tr,l,r,s,t);
  117. push_up(now);
  118. }
  119.  
  120. void work(){
  121. build_tree(,,n);
  122. for(int i=;i<=m;i++){
  123. int cas; scanf("%d",&cas);
  124. if(cas == ){
  125. int l,r; scanf("%d%d",&l,&r);
  126. node forw = Query(,,n,l,r);
  127. double pjx = 1.0*forw.sumx/(r-l+),pjy = 1.0*forw.sumy/(r-l+);
  128. double res=forw.multi+pjx*pjy*(r-l+)-pjx*forw.sumy-pjy*forw.sumx;
  129. res /= 1.0*(forw.sqr+pjx*pjx*(r-l+)-2.0*pjx*forw.sumx);
  130. printf("%.10lf\n",res);
  131. }else{
  132. if(cas == ){
  133. int l,r,s,t; scanf("%d%d%d%d",&l,&r,&s,&t);
  134. Modify1(,,n,l,r,s,t);
  135. }else{
  136. int l,r,s,t; scanf("%d%d%d%d",&l,&r,&s,&t);
  137. Modify2(,,n,l,r,s,t);
  138. }
  139. }
  140. }
  141. }
  142.  
  143. int main(){
  144. read();
  145. work();
  146. return ;
  147. }

洛谷3707 [SDOI2017] 相关分析 【线段树】的更多相关文章

  1. 洛谷P3707 [SDOI2017]相关分析(线段树)

    题目描述 Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. Frank不仅喜欢观测,还喜欢分析观测到的数据.他经常分析两个 ...

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

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

  3. 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...

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

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

  5. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

  6. 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)

    洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...

  7. 洛谷P4065 [JXOI2017]颜色(线段树)

    题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...

  8. 洛谷P5111 zhtobu3232的线段树

    题意:给定线段树,上面若干个节点坏了,求能表示出多少区间. 区间能被表示出当且仅当拆出来的log个节点都是好的. 解:每个区间在最浅的节点处计算答案. 对于每个节点维护从左边过来能有多少区间,从右边过 ...

  9. BZOJ.4821.[SDOI2017]相关分析(线段树)

    BZOJ LOJ 洛谷 恶心的拆式子..然后就是要维护\(\sum x_i,\ \sum y_i,\ \sum x_iy_i,\ \sum x_i^2\). 操作三可以看成初始化一遍,然后同操作二. ...

随机推荐

  1. Arduino Core For ESP8266

    如果选择纯C作为ESP8266的开发,有两个途径: 使用乐鑫官方原生的 RTOS-SDK或者NONOS-SDK 使用Arduino IDE 使用PlatformIO 作为一个"Arduino ...

  2. python数据类型--set(集合)

    博客地址:http://www.cnblogs.com/yudanqu/ 首先,简单介绍一下set,set就是我们中学时所学的集合,当时集合的性质就包括一点,集合里不能有重复的数字.我们现在所用到的集 ...

  3. 如何向微软 Docs 和本地化社区提交翻译贡献

    Docs (docs.microsoft.com)是微软新版的文档网站,重新规划了各项技术栈的文档结构,看起来比 MSDN 可读性更好.虽然 Docs 提供了各种语言的版本,但大多是机器翻译,某些中文 ...

  4. 朱晔和你聊Spring系列S1E10:强大且复杂的Spring Security(含OAuth2三角色+三模式完整例子)

    Spring Security功能多,组件抽象程度高,配置方式多样,导致了Spring Security强大且复杂的特性.Spring Security的学习成本几乎是Spring家族中最高的,Spr ...

  5. H5 类选择器

    10-类选择器 错误的写法: --> 迟到毁一生 早退穷三代 按时上下班 必成高富帅 我是段落 我是段落 <!DOCTYPE html> <html lang="en ...

  6. hibernate坑边闲话2

    threw exception [Request processing failed; nested exception is org.springframework.orm.hibernate5.H ...

  7. Tea Party CodeForces - 808C (构造+贪心)

    Polycarp invited all his friends to the tea party to celebrate the holiday. He has ncups, one for ea ...

  8. ES优化

    1.内存优化 在bin/elasticsearch.in.sh中进行配置 修改配置项为尽量大的内存: 1 2 ES_MIN_MEM=8g ES_MAX_MEM=8g 两者最好改成一样的,否则容易引发长 ...

  9. Java Core - static关键字的理解

    一.基本常识 二.关于main方法 我们最常见的static方法就是main方法,至于为什么main方法必须是static的,现在就很清楚了.因为程序在执行main方法的时候没有创建任何对象,因此只有 ...

  10. 开发环境搭建(lnmp)

    我们的开发环境一般现在时用Linux + Nginx + MySQL(mariaDB) + PHP的组合进行项目的搭建与开发,工欲善其事必先利其器. 搭建环境: Centos7 + mysql5.6 ...