参考资料:[Luogu 3707] SDOI2017 相关分析

P3707 [SDOI2017]相关分析

TFRAC FRAC DFRAC
\(\tfrac{\sum}{1}\) \(\frac{\sum}{1}\) \(\dfrac{\sum}{1}\)

\[\bar{x}=\frac{1}{R-L+1}\sum x_i​\]

\[\bar{y}=\frac{1}{R-L+1}\sum y_i​\]

\[\hat{a}=\dfrac{\sum_{i=L}^R(x_i-\bar{x})(y_i-\bar{y})}{\sum_{i=L}^R(x_i-\bar{x})^2}\]


记\(\sum = \sum_{i=L}^{R}​\)

Query

\[Ans=\dfrac{ \sum x_iy_i-\bar{x}\sum y_i-\bar{y}\sum x_i+\sum \bar{x}\bar{y}}{\sum x_i^2-2\bar{x}\sum x_i+\sum\bar{x^2}}​\]

\[=\dfrac{ \sum x_iy_i-\frac{1}{R-L+1}\sum x_i\sum y_i-\frac{1}{R-L+1}\sum y_i\sum x_i+\sum \frac{1}{R-L+1}\sum x_i\frac{1}{R-L+1}\sum y_i}{\sum x_i^2-\frac{1}{R-L+1}2\sum x_i\sum x_i+\sum (\frac{1}{R-L+1}\sum x_i)^2}​\]

\[=\dfrac{ \sum x_iy_i-\frac{\sum x_i\sum y_i}{R-L+1}}{\sum x_i^2-\frac{(\sum x_i)^2}{R-L+1}}\]

下传Tag:先\(upd\)后\(addX \quad addY\)

维护值:\(t1=\sum x​\) | \(t2=\sum y​\) | \(t3=\sum xy​\) | \(t4=\sum x^2​\)

维护Tag:\(addX \quad addY\)

\[\hat{a}=\dfrac{t3-\frac{t1t2}{R-L+1}}{t4-\frac{t1^2}{R-L+1}}​\]

Add

\[\Delta x = S \quad \Delta y= T​\]

\[\sum (x + S) = \sum x_i+(R-L+1)S ​\]

\[\sum(y+T)=\sum y_i+(R-L+1) T​\]

\[\sum(x+S)(y+T)=\sum(xy+Sy+Tx+ST)=\sum xy+S\sum y+T\sum x+(R-L+1)ST​\]

\[\sum(x+S)^2=\sum x^2+2S\sum x+(R-L+1)S^2\]

下传Tag:先\(upd\)后\(addX \quad addY\)

顺序:先\(t3,t4\)后\(t1,t2\)

Update

自然数平方和:\[\sum_{i=1}^ni=\frac{n(n+1)(2n+1)}{6}\]

1.\(\forall i \in [L,R]\quad x_i=i\ \ y_i=i​\)

\[\sum x=\sum y = \sum i = \frac{(R-L+1)(R+L)}{2}\]

\[\sum x^2 = \sum xy = \sum i ^2 = \sum_{i=1}^R i^2-\sum_{i=1}^{L-1}i^2=\frac{R(R+1)(2R+1)}{6}-\frac{L(L-1)(2L-1)}{6}\]

下传Tag:先\(upd\)后\(addX \quad addY\)

清空Tag \(addX \quad addY\)

标记Tag \(upd​\)

2.ADD L R S T

Code

  1. #include <iostream>
  2. #include <cstdio>
  3. #define ll long long
  4. using namespace std;
  5. const int N = 100005;
  6. int n, m;
  7. double X[N], Y[N];
  8. struct Segment_Tree
  9. {
  10. #define ls (p << 1)
  11. #define rs (p << 1 | 1)
  12. #define mid ((l + r) >> 1)
  13. bool upd[N << 2];
  14. double x[N << 2], y[N << 2];
  15. double t1[N << 2], t2[N << 2], t3[N << 2], t4[N << 2];
  16. inline void pushup(ll p)
  17. {
  18. t1[p] = t1[ls] + t1[rs];
  19. t2[p] = t2[ls] + t2[rs];
  20. t3[p] = t3[ls] + t3[rs];
  21. t4[p] = t4[ls] + t4[rs];
  22. }
  23. inline void pushdown(ll p, ll l, ll r)
  24. {
  25. double L = mid - l + 1, R = r - mid;
  26. if(upd[p]) {
  27. double Ll = l, Lr = mid, Rl = mid + 1, Rr = r;
  28. t1[ls] = t2[ls] = (Lr - Ll + 1.0) * (Lr + Ll) / 2.0;
  29. t1[rs] = t2[rs] = (Rr - Rl + 1.0) * (Rr + Rl) / 2.0;
  30. t3[ls] = t4[ls] = Lr * (Lr + 1.0) * (2.0 * Lr + 1.0) / 6.0 - Ll * (Ll - 1.0) * (2.0 * Ll - 1.0) / 6.0;
  31. t3[rs] = t4[rs] = Rr * (Rr + 1.0) * (2.0 * Rr + 1.0) / 6.0 - Rl * (Rl - 1.0) * (2.0 * Rl - 1.0) / 6.0;
  32. upd[ls] = upd[rs] = upd[p]; upd[p] = 0;
  33. x[ls] = x[rs] = y[ls] = y[rs] = 0;
  34. }
  35. if(x[p] || y[p]) {
  36. t3[ls] += x[p] * t2[ls] + y[p] * t1[ls] + L * x[p] * y[p];
  37. t3[rs] += x[p] * t2[rs] + y[p] * t1[rs] + R * x[p] * y[p];
  38. }
  39. if(x[p]) {
  40. t4[ls] += 2 * x[p] * t1[ls] + L * x[p] * x[p];
  41. t4[rs] += 2 * x[p] * t1[rs] + R * x[p] * x[p];
  42. t1[ls] += L * x[p];
  43. t1[rs] += R * x[p];
  44. x[ls] += x[p];
  45. x[rs] += x[p];
  46. x[p] = 0;
  47. }
  48. if(y[p]) {
  49. t2[ls] += (double)L * y[p];
  50. t2[rs] += (double)R * y[p];
  51. y[ls] += y[p];
  52. y[rs] += y[p];
  53. y[p] = 0;
  54. }
  55. }
  56. void build(ll p, ll l, ll r)
  57. {
  58. if(l == r) {
  59. t1[p] = X[l];
  60. t2[p] = Y[l];
  61. t3[p] = X[l] * Y[l];
  62. t4[p] = X[l] * X[l];
  63. return;
  64. }
  65. upd[p] = x[p] = y[p] = 0;
  66. build(ls, l, mid);
  67. build(rs, mid + 1, r);
  68. pushup(p);
  69. }
  70. void add(ll p, ll l, ll r, ll ql, ll qr, double S, double T)
  71. {
  72. if(ql <= l && r <= qr) {
  73. double len = (r - l + 1);
  74. t3[p] += S * t2[p] + T * t1[p] + len * S * T;
  75. t4[p] += 2 * S * t1[p] + len * S * S;
  76. t1[p] += len * S;
  77. t2[p] += len * T;
  78. x[p] += S; y[p] += T;
  79. return;
  80. }
  81. pushdown(p, l, r);
  82. if(ql <= mid) add(ls, l, mid, ql, qr, S, T);
  83. if(qr > mid) add(rs, mid + 1, r, ql, qr, S, T);
  84. pushup(p);
  85. }
  86. void update(ll p, ll l, ll r, ll ql, ll qr) {
  87. if(ql <= l && r <= qr) {
  88. t1[p] = t2[p] = (double)(r - l + 1.0) * (l + r) / 2.0;
  89. t3[p] = t4[p] = (double)r * (r + 1.0) * (2.0 * r + 1) / 6.0 - (double)l * (l - 1.0) * (2.0 * l - 1.0) / 6.0;
  90. x[p] = y[p] = 0;
  91. upd[p] = 1;
  92. return;
  93. }
  94. pushdown(p, l, r);
  95. if(ql <= mid) update(ls, l, mid, ql, qr);
  96. if(qr > mid) update(rs, mid + 1, r, ql, qr);
  97. pushup(p);
  98. }
  99. double query(ll p, ll l, ll r, ll ql, ll qr, ll f) {
  100. if(ql <= l && r <= qr) {
  101. if(f == 1) return t1[p];
  102. if(f == 2) return t2[p];
  103. if(f == 3) return t3[p];
  104. if(f == 4) return t4[p];
  105. }
  106. pushdown(p, l, r);
  107. double res = 0;
  108. if(ql <= mid) res += query(ls, l, mid, ql, qr, f);
  109. if(qr > mid) res += query(rs, mid + 1, r, ql ,qr, f);
  110. return res;
  111. }
  112. #undef ls
  113. #undef rs
  114. #undef mid
  115. };
  116. struct Segment_Tree Tree;
  117. int main()
  118. {
  119. scanf("%d %d", &n, &m);
  120. for(int i = 1; i <= n; i++) scanf("%lf", &X[i]);
  121. for(int i = 1; i <= n; i++) scanf("%lf", &Y[i]);
  122. Tree.build(1, 1, n);
  123. int opt, L, R; double S, T;
  124. while(m--)
  125. {
  126. scanf("%d", &opt);
  127. if(opt == 1)
  128. {
  129. scanf("%d %d", &L, &R);
  130. double t1 = Tree.query(1, 1, n, L, R, 1);
  131. double t2 = Tree.query(1, 1, n, L, R, 2);
  132. double t3 = Tree.query(1, 1, n, L, R, 3);
  133. double t4 = Tree.query(1, 1, n, L, R, 4);
  134. double a_ = (t3 - (t1 * t2) / (double)(R - L + 1)) / (t4 - (t1 * t1) / (double)(R - L + 1));
  135. printf("%.10lf\n", a_);
  136. }
  137. else if(opt == 2)
  138. {
  139. scanf("%d %d %lf %lf", &L, &R, &S, &T);
  140. Tree.add(1, 1, n, L, R, S, T);
  141. }
  142. else if(opt == 3)
  143. {
  144. scanf("%d %d %lf %lf", &L, &R, &S, &T);
  145. Tree.update(1, 1, n, L, R);
  146. Tree.add(1, 1, n, L, R, S, T);
  147. }
  148. }
  149. return 0;
  150. }

[题目] Luogu P3707 [SDOI2017]相关分析的更多相关文章

  1. luogu P3707 [SDOI2017]相关分析

    传送门 对于题目要求的东西,考虑拆开懒得拆了 ,可以发现有\(\sum x\sum y\sum x^2\sum xy\)四个变量影响最终结果,考虑维护这些值 下面记\(l,r\)为区间两端点 首先是区 ...

  2. [Luogu 3707] SDOI2017 相关分析

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

  3. P3707 [SDOI2017]相关分析

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

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

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

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

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

  6. BZOJ4817 SDOI2017 相关分析

    4821: [Sdoi2017]相关分析 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge Description Frank对天文 ...

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

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

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

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

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

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

随机推荐

  1. 整合Spring和SpringMVC

    1.Spring容器和SpringMVC容器的关系 Spring容器是一个父容器,SpringMVC容器是一个子容器,它继承自Spring容器.因此,在SpringMVC容器中,可以访问到Spring ...

  2. Fibonacci快速实现(优化)

    斐波那契数列的通俗解法是利用递推公式进行递归求解,我们可以更优化的去解决它. 方法一:通项公式 斐波那契数列的递推公式是f(n)=f(n-1)+f(n-2),特征方程为:x2=x+1,解该方程得(1+ ...

  3. InnoDB存储引擎概览

    InnoDB存储引擎概览   InnoDB存储引擎以其平衡了高可靠性和高性能性而闻名遐迩,在MySQL 8.0版本中,InnoDB存储引擎是默认的存储引擎.(历史追溯从MySQL 5.5.5版本开始, ...

  4. [转]在Node.js中使用RabbitMQ系列一 Hello world

    本文转自:https://www.cnblogs.com/cpselvis/p/6288330.html 在前一篇文章中可伸缩架构简短系列中提到过关于异步的问题.当时推荐使用RabbitMQ来做任务队 ...

  5. 如何在 ASP.NET Core 测试中操纵时间?

    有时候,我们会遇到一些跟系统当前时间相关的需求,例如: 只有开学季才允许录入学生信息 只有到了晚上或者周六才允许备份博客 注册满 3 天的用户才允许进行一些操作 某用户在 24 小时内被禁止发言 很显 ...

  6. JS处理数组内如果相同ID追加一个属性(如字体颜色)

    var arr=[{id:0},{id:0},{id:3},{id:2},{id:0},{id:4},{id:0},{id:1},{id:1},{id:2},{id:2}]; for(var i=0; ...

  7. javasript中var、let和const区别

    let和const都是es5,es6新版本的js语言规范出来的定义,在这以前定义一个变量只能用var.let和const都是为了弥补var的一些缺陷而新设计出来的. 简单来说是: let是修复了var ...

  8. LintCode Sqrt(x)

    Implement int sqrt(int x). Compute and return the square root of x. Have you met this question in a ...

  9. Vue学习资料

    1. {{ msg }}插值表达式. v-text:将数据插入到页面中,没有闪烁问题. v-cloak:通过style属性选择器的方式display:none:防止闪烁问题. v-html:将标签解析 ...

  10. domOperation.js

    // 可视宽高var ch = document.documentElement.clientHeightvar cw = document.documentElement.clientWidth / ...