经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
BZOJ4373: 算术天才⑨与等差数列(线段树 hash?)
来源:cnblogs  作者:自为风月马前卒  时间:2019/1/31 9:27:04  对本文有异议

题意

题目链接

Sol

正经做法不会,听lxl讲了一种很神奇的方法

我们考虑如果满足条件,那么需要具备什么条件

设mx为询问区间最大值,mn为询问区间最小值

  1. mx - mn = (r - l) * k

  2. 区间和 = mn * len + \(\frac{n * (n - 1)}{2} k\)

  3. \(\text{立方和} = \sum_{i = 1}^{len} (mn + (i - 1)k) ^2\)

第三条后面的可以直接推式子推出来(\(\sum_{i = 1}^n i^2 = \frac{n(n+1)(2n+1)}{6}\))

最后的/6可以直接乘一下然后ull自然溢出。

  1. #include<bits/stdc++.h>
  2. #define ull unsigned long long
  3. #define LL long long
  4. #define Fin(x) {freopen(#x".in","r",stdin);}
  5. #define Fout(x) {freopen(#x".out","w",stdout);}
  6. using namespace std;
  7. const int MAXN = 4e6 + 10;
  8. inline int read() {
  9. char c = getchar(); int x = 0, f = 1;
  10. while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
  11. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  12. return x * f;
  13. }
  14. int N, M;
  15. #define ls k << 1
  16. #define rs k << 1 | 1
  17. struct {
  18. int l, r, mn, mx;
  19. ull s, s2;
  20. }T[MAXN];
  21. void update(int k) {
  22. T[k].mn = min(T[ls].mn, T[rs].mn);
  23. T[k].mx = max(T[ls].mx, T[rs].mx);
  24. T[k].s = T[ls].s + T[rs].s;
  25. T[k].s2 = T[ls].s2 + T[rs].s2;
  26. }
  27. void Build(int k, int ll, int rr) {
  28. T[k].l = ll; T[k].r = rr;
  29. if(ll == rr) {T[k].mn = T[k].mx = T[k].s = read(); T[k].s2 = T[k].s * T[k].s ; return ;}
  30. int mid = ll + rr >> 1;
  31. Build(ls, ll, mid); Build(rs, mid + 1, rr);
  32. update(k);
  33. }
  34. void Modify(int k, int p, int v) {
  35. if(T[k].l == T[k].r) {T[k].mn = T[k].mx = T[k].s = v; T[k].s2 = T[k].s * T[k].s; return ;}
  36. int mid = T[k].l + T[k].r >> 1;
  37. if(p <= mid) Modify(ls, p, v);
  38. if(p > mid) Modify(rs, p, v);
  39. update(k);
  40. }
  41. int QueryMn(int k, int ql, int qr) {
  42. if(ql <= T[k].l && T[k].r <= qr) return T[k].mn;
  43. int mid = T[k].l + T[k].r >> 1;
  44. if(ql > mid) return QueryMn(rs, ql, qr);
  45. else if(qr <= mid) return QueryMn(ls, ql, qr);
  46. else return min(QueryMn(ls, ql, qr), QueryMn(rs, ql, qr));
  47. }
  48. int QueryMx(int k, int ql, int qr) {
  49. if(ql <= T[k].l && T[k].r <= qr) return T[k].mx;
  50. int mid = T[k].l + T[k].r >> 1;
  51. if(ql > mid) return QueryMx(rs, ql, qr);
  52. else if(qr <= mid) return QueryMx(ls, ql, qr);
  53. else return max(QueryMx(ls, ql, qr), QueryMx(rs, ql, qr));
  54. }
  55. ull QuerySum(int k, int ql, int qr) {
  56. if(ql <= T[k].l && T[k].r <= qr) return T[k].s;
  57. int mid = T[k].l + T[k].r >> 1;
  58. if(ql > mid) return QuerySum(rs, ql, qr);
  59. else if(qr <= mid) return QuerySum(ls, ql, qr);
  60. else return QuerySum(ls, ql, qr) + QuerySum(rs, ql, qr);
  61. }
  62. ull QuerySum2(int k, int ql, int qr) {
  63. if(ql <= T[k].l && T[k].r <= qr) return T[k].s2;
  64. int mid = T[k].l + T[k].r >> 1;
  65. if(ql > mid) return QuerySum2(rs, ql, qr);
  66. else if(qr <= mid) return QuerySum2(ls, ql, qr);
  67. else return QuerySum2(ls, ql, qr) + QuerySum2(rs, ql, qr);
  68. }
  69. signed main() {
  70. N = read(); M = read();
  71. Build(1, 1, N);
  72. int GG = 0;
  73. while(M--) {
  74. int opt = read();
  75. if(opt == 1) {
  76. int x = read() ^ GG, y = read() ^ GG;
  77. Modify(1, x, y);
  78. } else {
  79. int l = read() ^ GG, r = read() ^ GG; ull k = read() ^ GG;
  80. ull n = r - l + 1, mn = QueryMn(1, l, r), mx = QueryMx(1, l, r);
  81. ull s = QuerySum(1, l, r), s2 = QuerySum2(1, l, r), ns = mn * n + n * (n - 1) * k / 2;
  82. ull gg = (6 * mn * mn * n) + (6 * mn * k * n * (n - 1)) + (k * k * (n - 1) * n * (2 * (n - 1) + 1)),
  83. gg2 = 6 * s2;
  84. if((mx - mn == (r - l) * k) &&
  85. (mn * n + n * (n - 1) / 2 * k == s) &&
  86. (gg == gg2)) puts("Yes"), GG++;
  87. else puts("No");
  88. }
  89. }
  90. return 0;
  91. }
  92. /*
  93. 5 3
  94. 1 3 2 5 6
  95. 2 2 2 23333
  96. 1 5 4
  97. 2 1 5 1
  98. */

原文链接:http://www.cnblogs.com/zwfymqz/p/10339555.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号