把式子展开以后会发现,可以用线段树维护$x,y,x*y,x^2$分别的区间和

然后操作有区间加和区间修改

这个pushdown的时候,如果改和加的标记同时存在,那一定是先改再加,要不然加的标记已经被清掉了

所以在pushdown的时候,如果有改的标记,要把孩子的加的标记清掉

然后注意细节就行了(用*传数组 然后在函数里改了的话 它真的会改的 怎么就意识不到呢...)

  1. #include<bits/stdc++.h>
  2. #define pa pair<int,int>
  3. #define CLR(a,x) memset(a,x,sizeof(a))
  4. using namespace std;
  5. typedef long long ll;
  6. const int maxn=1e5+,inf=1e9;
  7.  
  8. inline ll rd(){
  9. ll x=;char c=getchar();int neg=;
  10. while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
  11. while(c>=''&&c<='') x=x*+c-'',c=getchar();
  12. return x*neg;
  13. }
  14.  
  15. struct Node{
  16. double x,y,xy,x2;
  17. int l,r;
  18. Node(double a=,double b=,double c=,double d=,int e=,int f=){
  19. x=a,y=b,xy=c,x2=d,l=e,r=f;
  20. }
  21. }tr[maxn*];
  22. double laz[maxn*][];
  23. int ch[maxn*][],pct,X[maxn],Y[maxn];
  24. int N,M;
  25.  
  26. Node operator + (Node a,Node b){
  27. Node p;
  28. p.l=a.l,p.r=b.r;
  29. p.x=a.x+b.x,p.y=a.y+b.y;
  30. p.xy=a.xy+b.xy,p.x2=a.x2+b.x2;
  31. return p;
  32. }
  33.  
  34. inline void deal(Node &p,double *v){
  35. int r=p.r,l=p.l;
  36. if(v[]!=-inf){
  37. p.x=p.y=1ll*(p.r+p.l)*(p.r-p.l+)/;
  38. p.xy=p.x2=(1ll*r*(r+)*(*r+))/-(1ll*(l-)*l*(*l-))/;
  39. v[]+=v[],v[]+=v[];
  40. }
  41.  
  42. p.x2+=(p.r-p.l+)*v[]*v[]+*v[]*p.x;
  43. p.xy+=v[]*p.y+v[]*p.x+(p.r-p.l+)*v[]*v[];
  44. p.x+=(p.r-p.l+)*v[],p.y+=(p.r-p.l+)*v[];
  45. if(v[]!=-inf) v[]-=v[],v[]-=v[];
  46. }
  47.  
  48. inline void pushdown(int p){
  49. // return;
  50. if(!ch[p][]) return;
  51. if(laz[p][]==&&laz[p][]==&&laz[p][]==-inf) return;
  52. int a=ch[p][],b=ch[p][];
  53. if(laz[p][]!=-inf){
  54. laz[a][]=laz[a][]=laz[b][]=laz[b][]=;
  55. laz[a][]=laz[p][],laz[a][]=laz[p][];
  56. laz[b][]=laz[p][],laz[b][]=laz[p][];
  57. }
  58. laz[a][]+=laz[p][],laz[a][]+=laz[p][];
  59. laz[b][]+=laz[p][],laz[b][]+=laz[p][];
  60.  
  61. deal(tr[a],laz[p]);
  62. deal(tr[b],laz[p]);
  63. laz[p][]=laz[p][]=,laz[p][]=laz[p][]=-inf;
  64. }
  65.  
  66. void build(int &p,int l,int r){
  67. p=++pct;
  68. laz[p][]=laz[p][]=-inf;
  69. if(l==r){
  70. tr[p]=Node(X[l],Y[l],1ll*X[l]*Y[l],1ll*X[l]*X[l],l,r);
  71. }else{
  72. int m=l+r>>;
  73. build(ch[p][],l,m);
  74. build(ch[p][],m+,r);
  75. tr[p]=tr[ch[p][]]+tr[ch[p][]];
  76. }
  77. }
  78.  
  79. void query(int p,int l,int r,int x,int y,Node &q){
  80. pushdown(p);
  81. if(x<=l&&r<=y){
  82. if(!q.l) q=tr[p];
  83. else q=q+tr[p];
  84. }else{
  85. int m=l+r>>;
  86. if(x<=m) query(ch[p][],l,m,x,y,q);
  87. if(y>=m+) query(ch[p][],m+,r,x,y,q);
  88. }
  89. }
  90.  
  91. void add(int p,int l,int r,int x,int y,int s,int t){
  92. pushdown(p);
  93. if(x<=l&&r<=y){
  94. double v[];
  95. v[]=s,v[]=t;v[]=v[]=-inf;
  96. deal(tr[p],v);
  97. laz[p][]+=s,laz[p][]+=t;
  98. pushdown(p);
  99. }else{
  100. int m=l+r>>;
  101. if(x<=m) add(ch[p][],l,m,x,y,s,t);
  102. if(y>=m+) add(ch[p][],m+,r,x,y,s,t);
  103. tr[p]=tr[ch[p][]]+tr[ch[p][]];
  104. }
  105. }
  106.  
  107. void change(int p,int l,int r,int x,int y,int s,int t){
  108. if(x<=l&&r<=y){
  109. double v[];
  110. v[]=v[]=,v[]=s,v[]=t;
  111. deal(tr[p],v);
  112. laz[p][]=laz[p][]=,laz[p][]=s,laz[p][]=t;
  113. pushdown(p);
  114. }else{
  115. pushdown(p);
  116. int m=l+r>>;
  117. if(x<=m) change(ch[p][],l,m,x,y,s,t);
  118. if(y>=m+) change(ch[p][],m+,r,x,y,s,t);
  119. tr[p]=tr[ch[p][]]+tr[ch[p][]];
  120. }
  121. }
  122.  
  123. int main(){
  124. int i,j,k;
  125. N=rd(),M=rd();
  126. for(i=;i<=N;i++) X[i]=rd();
  127. for(i=;i<=N;i++) Y[i]=rd();
  128. build(i,,N);
  129. for(i=;i<=M;i++){
  130. int a=rd(),b=rd(),c=rd();
  131. if(a==){
  132. Node p;
  133. query(,,N,b,c,p);
  134. double xb=p.x/(c-b+),yb=p.y/(c-b+);
  135. double ans=;
  136. ans=p.xy-xb*p.y-yb*p.x+xb*yb*(c-b+);
  137. ans/=p.x2-*xb*p.x+xb*xb*(c-b+);
  138. printf("%.10lf\n",ans);
  139. }else{
  140. int d=rd(),e=rd();
  141. if(a==){
  142. add(,,N,b,c,d,e);
  143. }else if(a==){
  144. change(,,N,b,c,d,e);
  145. }
  146. }
  147. }
  148. return ;
  149. }

luogu3707 相关分析 (线段树)的更多相关文章

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

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

  2. 【BZOJ4821】【SDOI2017】相关分析 [线段树]

    相关分析 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Frank对天文学非常感兴趣,他经 ...

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

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

  4. BZOJ 4821 [Sdoi2017]相关分析 ——线段树

    打开题面,看到许多$\sum$ woc,好神啊,SDOI好强啊 然后展开之后,woc,SDOI好弱啊,怎么T3出个线段树裸题啊. 最后写代码的时候,woc,SDOI怎么出个这么码农的题啊,怎么调啊. ...

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

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

  6. BZOJ 4821: [Sdoi2017]相关分析 线段树 + 卡精

    考试的时候切掉了,然而卡精 + 有一个地方忘开 $long long$,完美挂掉 $50$pts. 把式子化简一下,然后直接拿线段树来维护即可. Code: // luogu-judger-enabl ...

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

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

  8. SDOI2017相关分析 线段树

    题目 https://loj.ac/problem/2005 思路 \[ \sum_{L}^{R}{(x_i-x)^{2}} \] \[ \sum_{L}^{R}{(x_i^2-2*x_i*x+x^{ ...

  9. LOJ #2005. 「SDOI2017」相关分析 线段树维护回归直线方程

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

随机推荐

  1. Codeforces Edu Round 63(Rated for Div. 2)

    感觉现在Edu场比以前的难多了…… A: 温暖人心 /* basic header */ #include <iostream> #include <cstdio> #incl ...

  2. [Oracle][Corruption]发生ORA00600[kdsgrp1]的时候,如何进行调查

    本质上,这很可能是坏块引发的,所以需要调查 关联的Table 中的坏块状况: Excerpt of trace file============================*** 2017-08- ...

  3. BZOJ 3561 DZY Loves Math VI

    BZOJ 3561 DZY Loves Math VI 求\(\sum_{i=1}^{n}\sum_{j=1}^{m}\text{lcm}(i,j)^{\gcd(i,j)}\),钦定\(n\leq m ...

  4. ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十五节--缓存小结与ABP框架项目中 Redis Cache的实现

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 缓存 为什么要用缓存 为什么要用缓存呢,说缓存之前先说使用缓存的优点. 减少寄宿服务器的往返调用(round-tr ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-WebApi与Unity注入

    系列目录 前言: 有时候我们系统需要开放数据给手机App端或其他移动设备,不得不说Asp.net WebApi是目前首选 本节记录Asp.net MVC WebApi怎么利用Unity注入.系列开头已 ...

  6. 阿里云OSS下载pdf文件,并在pdf文件上添加水印

    代码: 兵马未动,粮草先行 作者: 传说中的汽水枪 如有错误,请留言指正,欢迎一起探讨. 转载请注明出处. 公司要求从阿里云OSS下载pdf文件并且需要添加水印. 因此这里总结一下. 首先添加了一个F ...

  7. 函数:this & return、break、continue、exit()

    this this:的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象在调用的时候才能决定,谁调用的就指向谁. 情景1:指向 ...

  8. 后台跑包方法 断开ssh程序也能继续执行的方法screen命令

    aircrack-ng -w 字典路径 握手包路径 screen -S 001创建会话 screen -ls  列出窗口列表 screen -r 5位数字  进入会话指令 如果会话恢复不了,则是有可能 ...

  9. 印象之初:BugPhobia’s Brief Introduction

    0x01 :序言 I leave uncultivated today, was precisely yestoday perishes tomorrow which the person of th ...

  10. 软件工程导论课后习题Github作业(把一个英文句子中的单词次序逆序,单词中字母正常排列)

    Java源代码    package yly; import java.util.Scanner; public class ruanjian { public static void main(St ...