我们 TM 怎么又要上文化课。。我 哔哔哔哔哔哔

「SDOI2017」数字表格

题意

有 \(T\) 组数据,求

\[\prod_{i = 1}^{n} \prod_{j = 1}^{m} fib[\gcd(i, j)]
\]

$ 1 \leq n, m \leq 10 ^ 6, 1 \leq T \leq 1000 $

题解

又是一道莫比乌斯反演套路题。。

\[\begin{aligned}
&\prod_{i = 1}^{n} \prod_{j = 1}^{m} fib[\gcd(i, j)]\\
&=\prod_{d = 1}^{n} fib[d]^{\sum_{i = 1}^n\sum_{j = 1}^n [(i, j) = d]}
\end{aligned}
\]

写在幂次那里不好看,我们单独提出来。。。

\[\begin{aligned}
& \sum_{i = 1}^n\sum_{j = 1}^n [(i, j) = d]\\
&= \sum_{d | x} \mu(\frac x d) \lfloor \frac{n}{x} \rfloor \lfloor \frac{m}{x} \rfloor\\
&= \sum_{i = 1} ^ {\lfloor \frac{n}{d} \rfloor} \mu(i) \lfloor \frac{n}{id} \rfloor \lfloor \frac{m}{id} \rfloor
\end{aligned}
\]

我们令 \(T = id\) 那么原式就变成

\[\begin{aligned}
&\prod_{d = 1}^{n} fib[d]^{\sum_{i = 1} ^ {\lfloor \frac{n}{d} \rfloor} \mu(i) \lfloor \frac{n}{id} \rfloor \lfloor \frac{m}{id} \rfloor}\\
&= \prod_{T = 1}^n (\prod_{d | T} fib[d]^{\mu(\frac{T}{d} )})^{\lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor}
\end{aligned}
\]

预处理中间那个括号的内容,然后外面套整除分块即可。

其实不预处理,套两层整除分块 \(\mathcal LOJ\) 的机子可以卡过 QAQ

复杂度是 \(\mathcal O(n \log n + T \sqrt n \log n)\) 的。

代码

  1. #include <bits/stdc++.h>
  2. #define For(i, l, r) for(register int i = (l), _end_ = (int)(r); i <= _end_; ++i)
  3. #define Fordown(i, r, l) for(register int i = (r), _end_ = (int)(l); i >= _end_; --i)
  4. #define Set(a, v) memset(a, v, sizeof(a))
  5. using namespace std;
  6. bool chkmin(int &a, int b) {return b < a ? a = b, 1 : 0;}
  7. bool chkmax(int &a, int b) {return b > a ? a = b, 1 : 0;}
  8. inline int read() {
  9. int x = 0, fh = 1; char ch = getchar();
  10. for (; !isdigit(ch); ch = getchar() ) if (ch == '-') fh = -1;
  11. for (; isdigit(ch); ch = getchar() ) x = (x<<1) + (x<<3) + (ch ^ '0');
  12. return x * fh;
  13. }
  14. typedef long long ll;
  15. int n, m;
  16. const int N = 1e6 + 1e3;
  17. ll mu[N], prime[N / 4], fib[N], ifib[N], cnt, g[N], ig[N];
  18. bitset<N> is_prime;
  19. const int Mod = 1e9 + 7, Pmod = Mod - 1;
  20. ll fpm(ll x, ll power) {
  21. ll res = 1;
  22. for (; power; power >>= 1, (x *= x) %= Mod)
  23. if (power & 1) (res *= x) %= Mod;
  24. return res;
  25. }
  26. void Init(int maxn) {
  27. is_prime.set();
  28. is_prime[0] = is_prime[1] = false;
  29. int res; g[0] = ig[0] = g[1] = ifib[1] = mu[1] = fib[1] = 1;
  30. For (i, 2, maxn) {
  31. if (is_prime[i]) {
  32. prime[++cnt] = i;
  33. mu[i] = -1;
  34. }
  35. For (j, 1, cnt) {
  36. res = prime[j] * i;
  37. if (res > maxn) break ;
  38. is_prime[res] = false;
  39. if (i % prime[j]) mu[res] = -mu[i];
  40. else {mu[res] = 0; break ;}
  41. }
  42. g[i] = 1;
  43. fib[i] = fib[i - 1] + fib[i - 2];
  44. if (fib[i] >= Mod) fib[i] -= Mod;
  45. ifib[i] = fpm(fib[i], Mod - 2);
  46. }
  47. For (i, 1, maxn) {
  48. for (register int j = i, t = 1; j <= maxn; j += i, ++ t)
  49. if (mu[t] == 1) g[j] *= fib[i], g[j] = g[j] >= Mod ? g[j] % Mod : g[j];
  50. else if (mu[t] == -1) g[j] *= ifib[i], g[j] = g[j] >= Mod ? g[j] % Mod : g[j];
  51. (g[i] *= g[i - 1]) %= Mod;
  52. ig[i] = fpm(g[i], Mod - 2);
  53. }
  54. }
  55. ll Calc() {
  56. cerr << "Calc: " << endl;
  57. ll res = 1; ll Nextd, n_, m_;
  58. if (n > m) swap(n, m);
  59. For(d, 1, n) {
  60. n_ = n / d; m_ = m / d;
  61. Nextd = min(n / n_, m / m_);
  62. (res *= fpm(g[Nextd] * ig[d - 1] % Mod, n_ * m_ % Pmod) ) %= Mod;
  63. d = Nextd;
  64. }
  65. return res;
  66. }
  67. void File() {
  68. #ifdef zjp_shadow
  69. freopen ("2000.in", "r", stdin);
  70. freopen ("2000.out", "w", stdout);
  71. #endif
  72. }
  73. int main() {
  74. File();
  75. Init((int)1e6);
  76. int cases = read();
  77. while (cases --) {
  78. n = read(); m = read();
  79. printf ("%lld\n", Calc() );
  80. }
  81. return 0;
  82. }

「SDOI2017」树点涂色

看我之前的 题解 就好啦。

似乎说是一个套路题?染上没有的颜色就是 access 的过程,然后套上线段树维护就好啦。

「SDOI2017」序列计数

题意

求有多少个长度为 $ n $ 的序列,至少有一个数是质数,序列中的数都是不超过 $ m $ 的正整数,而且这 $ n $ 个数的和是 $ p $ 的倍数。答案对于 \(20170408\) 取模。

$ 1 \leq n \leq 10 ^ 9, 1 \leq m \leq 2 \times 10 ^ 7, 1 \leq p \leq 100 $。

题解

看到数据就知道是思博矩幂了,可以做到 \(\mathcal O(m + p^3 \log n)\) 。

其实这是个循环矩阵,无限自乘还是循环的。我们只需要维护其中一行就知道其它所有行了,那每次拿个向量搞搞得出一行就行啦。

这样可以做到 \(\mathcal O(m + p^2 \log n)\) 。

其实那个过程本质上是循环卷积,但是和 \(FFT\) 关于 \(2^k\) 循环似乎不太契合。

那么这个多项式快速幂每次只能做到 \(\mathcal O(m + p \log p \log n)\) 。

其实可以利用 ln 变成加法,然后 exp 回去即可,做到 \(\mathcal O(m + p \log p)\) 。

但由于模数的鬼畜,不能用 NTT 利用 MTT 实现就好啦。。。

代码

显然我的做法是最暴力的矩幂啦 qwq

  1. #include <bits/stdc++.h>
  2. #define For(i, l, r) for (register int i = (l), i##end = (int)(r); i <= i##end; ++i)
  3. #define Fordown(i, r, l) for (register int i = (r), i##end = (int)(l); i >= i##end; --i)
  4. #define Rep(i, r) for (register int i = (0), i##end = (int)(r); i < i##end; ++i)
  5. #define Set(a, v) memset(a, v, sizeof(a))
  6. #define Cpy(a, b) memcpy(a, b, sizeof(a))
  7. #define debug(x) cout << #x << ": " << (x) << endl
  8. using namespace std;
  9. template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }
  10. template<typename T> inline bool chkmax(T &a, T b) { return b > a ? a = b, 1 : 0; }
  11. inline int read() {
  12. int x(0), sgn(1); char ch(getchar());
  13. for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
  14. for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
  15. return x * sgn;
  16. }
  17. void File() {
  18. #ifdef zjp_shadow
  19. freopen ("2002.in", "r", stdin);
  20. freopen ("2002.out", "w", stdout);
  21. #endif
  22. }
  23. const int N = 2e7 + 1e3, M = 110, Mod = 20170408;
  24. int n, m, p;
  25. bitset<N> is_prime; int prime[N], plen;
  26. void Linear_Sieve(int maxn) {
  27. is_prime.set();
  28. is_prime[0] = is_prime[1] = false;
  29. For (i, 2, maxn) {
  30. if (is_prime[i])
  31. prime[++ plen] = i;
  32. For (j, 1, plen) {
  33. int res = prime[j] * i;
  34. if (res > maxn) break;
  35. is_prime[res] = false;
  36. if (!(i % prime[j])) break;
  37. }
  38. }
  39. }
  40. int ptot[M], tot[M];
  41. struct Mat {
  42. int a[M][M];
  43. Mat() { Set(a, 0); }
  44. inline void Unit() {
  45. Rep (i, p) a[i][i] = 1;
  46. }
  47. inline Mat friend operator * (const Mat &lhs, const Mat &rhs) {
  48. Mat res;
  49. Rep (i, p) Rep (k, p) Rep (j, p)
  50. res.a[i][j] = (res.a[i][j] + 1ll * lhs.a[i][k] * rhs.a[k][j]) % Mod;
  51. return res;
  52. }
  53. };
  54. inline Mat fpm(Mat x, int power) {
  55. Mat res; res.Unit();
  56. for (; power; power >>= 1, x = x * x)
  57. if (power & 1) res = res * x;
  58. return res;
  59. }
  60. Mat f, trans;
  61. int main () {
  62. File();
  63. n = read(); m = read(); p = read();
  64. Linear_Sieve(m);
  65. For (i, 1, m) {
  66. ++ tot[i % p];
  67. if (is_prime[i]) ++ ptot[i % p];
  68. }
  69. Rep (i, p) Rep (j, p)
  70. trans.a[(i + j) % p][i] += tot[j];
  71. f.a[0][0] = 1; f = fpm(trans, n) * f;
  72. int ans = f.a[0][0];
  73. Rep (i, p) Rep (j, p)
  74. trans.a[(i + j) % p][i] -= ptot[j];
  75. Set(f.a, 0); f.a[0][0] = 1; f = fpm(trans, n) * f;
  76. ans = (ans + Mod - f.a[0][0]) % Mod;
  77. printf ("%d\n", ans);
  78. return 0;
  79. }

「SDOI2017」新生舞会

题意

左右各有 \(n\) 个点的二分图, \(a_{i, j}, b_{i, j}\) 为 \(i, j\) 匹配能得到的两个权值。

一个方案中有 $ n $ 对匹配,假设每组匹配的权值 \(a_{i, j}\) 分别是 $ a'_1, a'_2, \ldots, a'_n $, \(b_{i, j}\) 分别是 $ b'_1, b'_2, \ldots, b'_n $。令

求一个完美匹配,使得

\[C = \frac{a'_1 + a'_2 + \cdots + a'_n}{b'_1 + b'_2 + \cdots + b'_n}
\]

尽量大。

题解

这 round1 模板题是真多。。。

直接分数规划,二分 \(C\) ,边权就变成 \(a_{i, j} - C \times b_{i, j}\) 。

那么就是找一个完美匹配使得匹配的边权和不小于 \(0\) 。

然后用 KM 或者费用流跑最大权匹配就行了。

代码

  1. #include <bits/stdc++.h>
  2. #define For(i, l, r) for (register int i = (l), i##end = (int)(r); i <= i##end; ++i)
  3. #define Fordown(i, r, l) for (register int i = (r), i##end = (int)(l); i >= i##end; --i)
  4. #define Rep(i, r) for (register int i = (0), i##end = (int)(r); i < i##end; ++i)
  5. #define Set(a, v) memset(a, v, sizeof(a))
  6. #define Cpy(a, b) memcpy(a, b, sizeof(a))
  7. #define debug(x) cout << #x << ": " << (x) << endl
  8. using namespace std;
  9. template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }
  10. template<typename T> inline bool chkmax(T &a, T b) { return b > a ? a = b, 1 : 0; }
  11. inline int read() {
  12. int x(0), sgn(1); char ch(getchar());
  13. for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
  14. for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
  15. return x * sgn;
  16. }
  17. void File() {
  18. #ifdef zjp_shadow
  19. freopen ("2003.in", "r", stdin);
  20. freopen ("2003.out", "w", stdout);
  21. #endif
  22. }
  23. const int inf = 0x3f3f3f3f;
  24. template<int Maxn, int Maxm>
  25. struct MCMF {
  26. int Head[Maxn], Next[Maxm], to[Maxm], cap[Maxm], e; double val[Maxm];
  27. void Init() {
  28. e = 1; Set(Head, 0);
  29. }
  30. inline void add_edge(int u, int v, double cost, int flow) {
  31. to[++ e] = v; Next[e] = Head[u]; Head[u] = e;
  32. val[e] = cost; cap[e] = flow;
  33. }
  34. inline void Add(int u, int v, double cost, int flow) {
  35. add_edge(u, v, cost, flow); add_edge(v, u, -cost, 0);
  36. }
  37. int S, T;
  38. int pre[Maxn]; double dis[Maxn]; bitset<Maxn> inq;
  39. bool Spfa() {
  40. queue<int> Q;
  41. For (i, 1, T) dis[i] = - 1e8;
  42. Set(pre, 0); inq.reset();
  43. Q.push(S); dis[S] = 1;
  44. while (!Q.empty()) {
  45. int u = Q.front(); Q.pop(); inq[u] = false;
  46. for (int i = Head[u], v = to[i]; i; v = to[i = Next[i]]) {
  47. if (cap[i] && chkmax(dis[v], dis[u] + val[i])) {
  48. pre[v] = i; if (!inq[v]) inq[v] = true, Q.push(v);
  49. }
  50. }
  51. }
  52. return pre[T];
  53. }
  54. double Run() {
  55. int sum_flow = 0; double sum_cost = 0;
  56. while (Spfa()) {
  57. int flow = inf;
  58. for (int u = T; u != S; u = to[pre[u] ^ 1]) chkmin(flow, cap[pre[u]]);
  59. for (int u = T; u != S; u = to[pre[u] ^ 1]) {
  60. cap[pre[u]] -= flow;
  61. cap[pre[u] ^ 1] += flow;
  62. sum_cost += val[pre[u]] * flow;
  63. }
  64. sum_flow += flow;
  65. }
  66. return sum_cost;
  67. }
  68. };
  69. const int N = 110;
  70. const double eps = 1e-8;
  71. MCMF<N * 2, N * N * 2> T;
  72. int n; double A[N][N], B[N][N];
  73. #define In(x) (x)
  74. #define Out(x) ((x) + n)
  75. inline bool check(double k) {
  76. T.Init();
  77. T.T = (T.S = Out(n) + 1) + 1;
  78. For (i, 1, n) {
  79. T.Add(T.S, In(i), 0, 1);
  80. T.Add(Out(i), T.T, 0, 1);
  81. }
  82. For (i, 1, n) For (j, 1, n)
  83. T.Add(In(i), Out(j), A[i][j] - k * B[i][j], 1);
  84. return T.Run() > 0;
  85. }
  86. int main () {
  87. File();
  88. n = read();
  89. For (i, 1, n) For (j, 1, n) A[i][j] = read();
  90. For (i, 1, n) For (j, 1, n) B[i][j] = read();
  91. double l = 0.0, r = 1e8;
  92. while (r - l > eps) {
  93. double mid = (l + r) / 2.0;
  94. if (check(mid)) l = mid; else r = mid;
  95. }
  96. printf ("%.6lf\n", l);
  97. return 0;
  98. }

「SDOI2017」硬币游戏

题意

选出 $ n $ 个同学, 每个同学猜一个长度为 $ m $ 的序列,当某一个同学猜的序列在硬币序列中出现时,就不再扔硬币了,并且这个同学胜利。为了保证只有一个同学胜利,同学们猜的 $ n $ 个序列两两不同。

最后求出每个同学胜利的概率。

$ 1 \leq n, m \leq 300 $

题解

六道题里唯一没有那么思博的题。。

暴力 ac自动机 + 高斯消元 是 \(\mathcal O((nm)^3)\) 的,只有 \(40\) 分。

考虑优化,显然我们最后要求的只有 \(n\) 个变量的值,其他变量都是毫无意义的。

那么我们只需要求出这些变量之间的相关方程即可。

我们多设一个 \(f_s\) 为不匹配到其中任意一个同学的概率,那么我们在当前串后面添加一个同学 \(i\) 的拥有的字符串 \(S_i\) 就能对应到它的概率。

这个似乎利用了一个结论,如果不匹配到 \(n\) 个结束节点,停到任意一个点的概率似乎是相同的。

但是这样会把 \(S_i\) 有个前缀和 \(S_j\) 一个后缀是一样的概率多算上去,我们减掉就行了,这个出现的概率是 \(2^{-l}\) ,\(l\) 为这个前缀的长度。

利用 KMP 实现就可以做到 \(\mathcal O(n^2(n + m))\) 啦。

代码

我懒,用的暴力匹配。。也过啦。。

  1. #include <bits/stdc++.h>
  2. #define For(i, l, r) for (register int i = (l), i##end = (int)(r); i <= i##end; ++i)
  3. #define Fordown(i, r, l) for (register int i = (r), i##end = (int)(l); i >= i##end; --i)
  4. #define Rep(i, r) for (register int i = (0), i##end = (int)(r); i < i##end; ++i)
  5. #define Set(a, v) memset(a, v, sizeof(a))
  6. #define Cpy(a, b) memcpy(a, b, sizeof(a))
  7. #define debug(x) cout << #x << ": " << (x) << endl
  8. using namespace std;
  9. template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }
  10. template<typename T> inline bool chkmax(T &a, T b) { return b > a ? a = b, 1 : 0; }
  11. inline int read() {
  12. int x(0), sgn(1); char ch(getchar());
  13. for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
  14. for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
  15. return x * sgn;
  16. }
  17. void File() {
  18. #ifndef ONLINE_JUDGE
  19. freopen ("2004.in", "r", stdin);
  20. freopen ("2004.out", "w", stdout);
  21. #endif
  22. }
  23. const int N = 310;
  24. double G[N][N];
  25. void Gauss(int n) {
  26. For (i, 1, n) {
  27. For (j, i + 1, n) if (fabs(G[j][i]) > fabs(G[i][i])) swap(G[i], G[j]);
  28. if (!G[i][i]) continue;
  29. Fordown (j, n + 1, i) G[i][j] /= G[i][i];
  30. For (j, i + 1, n) Fordown (k, n + 1, i) G[j][k] -= G[j][i] * G[i][k];
  31. }
  32. Fordown (i, n, 1) {
  33. For (j, 1, i - 1)
  34. G[j][n + 1] -= G[j][i] * G[i][n + 1], G[j][i] = 0;
  35. }
  36. }
  37. int n, m; double inv[N];
  38. char str[N][N];
  39. int main() {
  40. File();
  41. n = read(); m = read();
  42. For (i, 1, n) scanf ("%s", str[i] + 1);
  43. inv[0] = 1.0;
  44. For (i, 1, m) inv[i] = inv[i - 1] / 2.0;
  45. For (i, 1, n) {
  46. G[i][i] = 1.0; G[i][n + 1] = - 1.0;
  47. For (j, 1, n) {
  48. For (p, 2, m) {
  49. int len = 1;
  50. while (p + len - 1 <= m && str[i][len] == str[j][p + len - 1]) ++ len;
  51. if (p + len == m + 2) G[i][j] += inv[p - 1];
  52. }
  53. }
  54. }
  55. For (i, 1, n) G[n + 1][i] = 1.0; G[n + 1][n + 2] = 1.0;
  56. Gauss(n + 1);
  57. For (i, 1, n)
  58. printf ("%.10lf\n", G[i][n + 2]);
  59. return 0;
  60. }

「SDOI2017」相关分析

题意

一个序列,每个元素是一个点 \((x_i, y_i)\) 。

有 \(m\) 个操作,共有三种:

  • \(\texttt{1 L R}:\) 求 \([L, R]\) 的回归直线的斜率。

  • \(\texttt{2 L R S T}:\) 把 \(i \in [L, R]\) \(x_i\) 加上 \(S\) ,\(y_i\) 加上 \(T\) 。

  • \(\texttt{2 L R S T}:\) 把 \(i \in [L, R]\) \(x_i\) 变成 \(S + i\) ,\(y_i\) 变成 \(T + i\) 。

$ 1 \leq n, m \leq 10 ^ 5 $

题解

昨天才讲的回归直线。。今天就用上啦QAQ

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

这个数学书上常常用另外一种化简的方式。。

令 \(n = R - L + 1\) 即区间长度。

\[\hat{a} = \frac{(\sum\limits_{i = L} ^ R x_i y_i) - n\bar{x}\bar{y}}{(\sum\limits_{i = L} ^ R x_i^2) - n \bar{x}^2}
\]

然后维护区间 \(x, y, xy, x^2\) 的和就行了。

代码

  1. #include <bits/stdc++.h>
  2. #define For(i, l, r) for (register int i = (l), i##end = (int)(r); i <= i##end; ++i)
  3. #define Fordown(i, r, l) for (register int i = (r), i##end = (int)(l); i >= i##end; --i)
  4. #define Rep(i, r) for (register int i = (0), i##end = (int)(r); i < i##end; ++i)
  5. #define Set(a, v) memset(a, v, sizeof(a))
  6. #define Cpy(a, b) memcpy(a, b, sizeof(a))
  7. #define debug(x) cout << #x << ": " << (x) << endl
  8. using namespace std;
  9. template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }
  10. template<typename T> inline bool chkmax(T &a, T b) { return b > a ? a = b, 1 : 0; }
  11. inline int read() {
  12. int x(0), sgn(1); char ch(getchar());
  13. for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
  14. for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
  15. return x * sgn;
  16. }
  17. void File() {
  18. #ifdef zjp_shadow
  19. freopen ("2005.in", "r", stdin);
  20. freopen ("2005.out", "w", stdout);
  21. #endif
  22. }
  23. const int N = 1e5 + 1e3;
  24. using ll = double;
  25. ll pre1(ll x) {
  26. return x * (x + 1) / 2;
  27. }
  28. ll pre2(ll x) {
  29. return x * (x + 1) * (2 * x + 1) / 6;
  30. }
  31. #define ls o << 1
  32. #define rs o << 1 | 1
  33. #define mid ((l + r) >> 1)
  34. #define lson ls, l, mid
  35. #define rson rs, mid + 1, r
  36. template<int Maxn>
  37. struct Segment_Tree {
  38. ll sumxy[Maxn], sumx[Maxn], sumy[Maxn], sumxx[Maxn];
  39. int tag[Maxn], S[Maxn], T[Maxn];
  40. inline void modify(int o, int l, int r, int opt, int sv, int tv) {
  41. int len = r - l + 1;
  42. chkmax(tag[o], opt);
  43. if (opt == 2) {
  44. sumxy[o] += sv * sumy[o] + tv * sumx[o] + 1ll * len * sv * tv;
  45. sumxx[o] += 2 * sv * sumx[o] + 1ll * len * sv * sv;
  46. sumx[o] += 1ll * sv * len;
  47. sumy[o] += 1ll * tv * len;
  48. S[o] += sv; T[o] += tv;
  49. } else {
  50. sv += l; tv += l;
  51. sumxy[o] = 1ll * len * sv * tv + pre1(len - 1) * (sv + tv) + pre2(len - 1);
  52. sumxx[o] = 1ll * len * sv * sv + 2 * pre1(len - 1) * sv + pre2(len - 1);
  53. sumx[o] = 1ll * len * sv + pre1(len - 1);
  54. sumy[o] = 1ll * len * tv + pre1(len - 1);
  55. S[o] = sv - l; T[o] = tv - l;
  56. }
  57. }
  58. inline void push_down(int o, int l, int r) {
  59. if (tag[o]) {
  60. modify(lson, tag[o], S[o], T[o]);
  61. modify(rson, tag[o], S[o], T[o]);
  62. tag[o] = S[o] = T[o] = 0;
  63. }
  64. }
  65. inline void push_up(int o) {
  66. sumxy[o] = sumxy[ls] + sumxy[rs];
  67. sumxx[o] = sumxx[ls] + sumxx[rs];
  68. sumx[o] = sumx[ls] + sumx[rs];
  69. sumy[o] = sumy[ls] + sumy[rs];
  70. }
  71. void Update(int o, int l, int r, int opt, int ul, int ur, int sv, int tv) {
  72. if (ul <= l && r <= ur) {
  73. modify(o, l, r, opt, sv, tv); return;
  74. }
  75. push_down(o, l, r);
  76. if (ul <= mid) Update(lson, opt, ul, ur, sv, tv);
  77. if (ur > mid) Update(rson, opt, ul, ur, sv, tv);
  78. push_up(o);
  79. }
  80. ll Query(int o, int l, int r, int ql, int qr, ll *sum) {
  81. if (ql <= l && r <= qr) return sum[o];
  82. push_down(o, l, r); ll res = 0;
  83. if (ql <= mid) res += Query(lson, ql, qr, sum);
  84. if (qr > mid) res += Query(rson, ql, qr, sum);
  85. push_up(o); return res;
  86. }
  87. void Build(int o, int l, int r, int *x, int *y) {
  88. if (l == r) {
  89. sumxy[o] = 1ll * x[l] * y[r];
  90. sumxx[o] = 1ll * x[l] * x[r];
  91. sumx[o] = x[l]; sumy[o] = y[r];
  92. return;
  93. }
  94. Build(lson, x, y); Build(rson, x, y); push_up(o);
  95. }
  96. };
  97. Segment_Tree<N << 2> T;
  98. int n, m, x[N], y[N];
  99. #define root 1, 1, n
  100. int main () {
  101. File();
  102. n = read(); m = read();
  103. For (i, 1, n) x[i] = read();
  104. For (i, 1, n) y[i] = read();
  105. T.Build(root, x, y);
  106. while (m --) {
  107. int opt = read(), l = read(), r = read();
  108. if (opt == 1) {
  109. ll sumxy = T.Query(root, l, r, T.sumxy),
  110. sumxx = T.Query(root, l, r, T.sumxx),
  111. sumx = T.Query(root, l, r, T.sumx),
  112. sumy = T.Query(root, l, r, T.sumy), len = r - l + 1;
  113. double averx = 1.0 * sumx / len, avery = 1.0 * sumy / len,
  114. k = 1.0 * (sumxy - len * averx * avery) / (sumxx - len * averx * averx);
  115. printf ("%.6lf\n", k);
  116. } else {
  117. int sv = read(), tv = read();
  118. T.Update(root, opt, l, r, sv, tv);
  119. }
  120. }
  121. return 0;
  122. }

SDOI2017 Round1 简要题解的更多相关文章

  1. Codeforces Global Round1 简要题解

    Codeforces Global Round 1 A 模拟即可 # include <bits/stdc++.h> using namespace std; typedef long l ...

  2. SDOI2017 Round1 Day2 题解

    T2好厉害啊……AK不了啦……不过要是SCOI考这套题就好了240保底. BZOJ4819 新生舞会 模板题,分数规划+二分图最大权匹配. 费用流跑得过,可以不用KM. UPD:分数规划用迭代跑得飞快 ...

  3. SDOI2017 Round1 Day1 题解

    不知道有几个AK的,除了出题人SB搬了个BZOJ3779以外,应该没什么因素阻碍AK吧.要是SCOI考这套题多好. BZOJ4816 数字表格 SB反演,推出答案为$\prod_{i=1}^nf^{\ ...

  4. Noip 2014酱油记+简要题解

    好吧,day2T1把d默认为1也是醉了,现在只能期待数据弱然后怒卡一等线吧QAQ Day0 第一次下午出发啊真是不错,才2小时左右就到了233,在车上把sao和fate补掉就到了= = 然后到宾馆之后 ...

  5. SDOI2017 Round1

    SDOI2017 Round1 在回去的车上写的 cnblog的markdown貌似有bug,空行都没有了 Day -several [清明节] 没想到在省选之前还会有一次放假 放假前一天晚上走到校门 ...

  6. Tsinghua 2018 DSA PA2简要题解

    反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...

  7. Codeforces 863 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 简要题解?因为最后一题太毒不想写了所以其实是部分题解... A题 传送门 题意简述:给你一个数,问你能不能通过加前导000使其成为一个回文数 ...

  8. HNOI2018简要题解

    HNOI2018简要题解 D1T1 寻宝游戏 题意 某大学每年都会有一次 Mystery Hunt 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为 ...

  9. JXOI2018简要题解

    JXOI2018简要题解 T1 排序问题 题意 九条可怜是一个热爱思考的女孩子. 九条可怜最近正在研究各种排序的性质,她发现了一种很有趣的排序方法: Gobo sort ! Gobo sort 的算法 ...

随机推荐

  1. CentOS 7.2 yum安装LAMP环境

    https://www.linuxidc.com/Linux/2016-11/136766.htm 详见以上链接,用yum安装方便省事. 尤其注意,mysql数据要设置远程连接.

  2. sql定时备份

    老规矩,直接上代码: ) set @name='C:\Backup\MyStudy_'+ ),)+'.bak' BACKUP DATABASE[MyStudy]TO DISK=@name WITH N ...

  3. web安全测试排查

    漏洞排查思路: 1.上传漏洞 如果看到:选择你要上传的文件 [重新上传]或者出现“请登陆后使用”,80%就有漏洞了! 有时上传不一定会成功,这是因为Cookies不一样.我们就要用WSockExper ...

  4. restful 规范(建议)

    需求:开发cmdb,对用户进行管理. 做前后端分离,后端写api(URL),对用户表进行增删改查,应该写四个URL(还要给文档(返回值,返回,请求成功,干嘛,失败,干嘛)),然后分别写视图函数. ht ...

  5. Struts2——通配符,Action Method_DMI

    Action wildcard 通配符(配置量降到最低) 使用通配符,就是为了配置简便,但是一定遵守“约定优于配置”原则,约定就是做项目之前最好事先与项目组的人或是自己规定好命名规则. 多个*  {1 ...

  6. Decoder is not a @Sharable handler, so can't be added or removed multiple times

    Decoder is not a @Sharable handler, so can't be added or removed multiple times final MyMessageDecod ...

  7. python之路--模块和包

    一 . 模块 ⾸先,我们先看⼀个老⽣常谈的问题. 什么是模块. 模块就是⼀个包含了python定义和声明的⽂件, ⽂件名就是模块的名字加上.py后缀. 换句话说我们⽬前写的所有的py⽂件都可以看成是⼀ ...

  8. ES6 & Map & hashMap

    ES6 & Map & hashMap 01 two-sum https://leetcode.com/submissions/detail/141732589/ hashMap ht ...

  9. mybatis逆向工程,实现join多表查询,避免多表相同字段名的陷阱

    ​ mybatis逆向工程,实现join多表查询,避免多表相同字段名的陷阱 ​ 前言:使用 mybatis generator 生成表格对应的pojo.dao.mapper,以及对应的example的 ...

  10. Python——Button参数

    anchor:   指定按钮上文本的位置:  background(bg): 指定按钮的背景色:  bitmap:指定按钮上显示的位图:  borderwidth(bd): 指定按钮边框的宽度:  c ...