基础

模类

  1. constexpr int P = 1000000007;
  2. // assume -P <= x < 2P
  3. int norm(int x) { if (x < 0) x += P; else if (x >= P) x -= P; return x; }
  4. // 快速幂
  5. template <class T> T power(T a, int b) { T res = 1; for (; b; b /= 2, a *= a) { if (b % 2) { res *= a; } } return res; }
  6. struct Mint {
  7. int x;
  8. Mint(int x = 0) : x(norm(x)) {}
  9. int val() const { return x; }
  10. Mint operator-() const { return Mint(norm(P - x)); }
  11. Mint inv() const { assert(x != 0); return power(*this, P - 2); }
  12. Mint &operator*=(const Mint &rhs) { x = ll(x) * rhs.x % P; return *this; }
  13. Mint &operator+=(const Mint &rhs) { x = norm(x + rhs.x); return *this; }
  14. Mint &operator-=(const Mint &rhs) { x = norm(x - rhs.x); return *this; }
  15. Mint &operator/=(const Mint &rhs) { return *this *= rhs.inv(); }
  16. friend Mint operator*(const Mint &lhs, const Mint &rhs) { Mint res = lhs; res *= rhs; return res; }
  17. friend Mint operator+(const Mint &lhs, const Mint &rhs) { Mint res = lhs; res += rhs; return res; }
  18. friend Mint operator-(const Mint &lhs, const Mint &rhs) { Mint res = lhs; res -= rhs; return res; }
  19. friend Mint operator/(const Mint &lhs, const Mint &rhs) { Mint res = lhs; res /= rhs; return res; }
  20. };
  21. // 阶乘和逆元
  22. Mint fac[N], inv[N];
  23. inline Mint C(int A, int B){ return fac[A] * inv[B] * inv[A - B]; }
  24. /*** main ***/
  25. n = N - 1;
  26. fac[0] = 1;
  27. rep(i,1,n) fac[i] = fac[i-1] * i;
  28. inv[n] = fac[n].inv();
  29. per(i,n-1,0) inv[i] = inv[i+1] * (i + 1);
  30. /*** endmain ***/

数据结构

树状数组

  1. template <typename T>
  2. struct Fenwick {
  3. const int n;
  4. vector<T> a;
  5. Fenwick(int n): n(n), a(n + 1) {}
  6. void add(int x, T v){
  7. for(int i = x; i <= n; i += i & -i) a[i] += v;
  8. }
  9. T sum(int x) {
  10. T rs = 0;
  11. for(int i = x; i; i -= i & -i) {
  12. rs += a[i];
  13. }
  14. return rs;
  15. }
  16. T rangeSum(int l, int r) {
  17. if(l > r) return 0;
  18. return sum(r) - sum(l - 1);
  19. }
  20. };

线段树

http://oj.daimayuan.top/problem/813

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define dbg(x...) do { cout << "\033[32;1m" << #x <<" -> "; err(x); } while (0)
  4. void err() { cout << "\033[39;0m" << endl; }
  5. template<class T, class... Ts> void err(const T& arg,const Ts&... args) { cout << arg << " "; err(args...); }
  6. #define rep(i,j,k) for(int i=int(j);i<=int(k);i++)
  7. #define per(i,j,k) for(int i=int(j);i>=int(k);i--)
  8. typedef long long ll;
  9. const int inf = 1E9;
  10. template<class Info, class Merge = plus<Info>>
  11. struct SegTree{
  12. const int n;
  13. const Merge merge;
  14. vector<Info> info;
  15. SegTree(int n): n(n), merge(Merge()), info(4 * n) {}
  16. SegTree(int n, vector<Info>& init): SegTree(n) {
  17. function<void(int,int,int)> build = [&](int p, int l, int r) {
  18. if(l == r) {
  19. info[p] = init[l];
  20. return;
  21. }
  22. int m = (l + r) / 2;
  23. build(2 * p, l, m);
  24. build(2 * p + 1, m + 1, r);
  25. pull(p);
  26. };
  27. build(1, 1, n);
  28. }
  29. void pull(int p) {
  30. info[p] = merge(info[2 * p], info[2 * p + 1]);
  31. }
  32. void modify(int p, int l, int r, int x, const Info &v) {
  33. if(l == r) {
  34. info[p] = v;
  35. return;
  36. }
  37. int m = (l + r) / 2;
  38. if(x <= m) modify(p * 2, l, m, x, v);
  39. else modify(2 * p + 1, m + 1, r, x, v);
  40. pull(p);
  41. }
  42. void modify(int p, const Info &v) {
  43. modify(1, 1, n, p, v);
  44. }
  45. Info rangeQuery(int p, int l, int r, int x, int y) {
  46. if(l > y || r < x) {
  47. return Info();
  48. }
  49. if(l >= x && r <= y) return info[p];
  50. int m = (l + r) / 2;
  51. return merge(rangeQuery(p * 2, l, m, x, y), rangeQuery(p * 2 + 1, m + 1, r, x, y));
  52. }
  53. Info rangeQuery(int l, int r) {
  54. return rangeQuery(1, 1, n, l, r);
  55. }
  56. };
  57. // 创建结点信息、*运算
  58. struct Node {
  59. int ls, rs, mx, sum;
  60. Node() {
  61. Node(-inf);
  62. sum = 0;
  63. }
  64. Node(int val):ls(val),rs(val),mx(val),sum(val){}
  65. };
  66. Node operator * (const Node &l, const Node &r) {
  67. Node t;
  68. t.sum = l.sum + r.sum;
  69. t.mx = max(l.rs + r.ls, max(l.mx, r.mx));
  70. t.ls = max(l.ls, l.sum + r.ls);
  71. t.rs = max(r.rs, r.sum + l.rs);
  72. return t;
  73. }
  74. struct Mul {
  75. Node operator () (const Node &l, const Node &r) const {
  76. return l * r;
  77. }
  78. };
  79. int main() {
  80. ios::sync_with_stdio(false); cin.tie(nullptr);
  81. int n, m;
  82. cin >> n >> m;
  83. vector<Node> a(n + 1);
  84. rep(i,1,n) {
  85. int x; cin >> x;
  86. a[i] = Node(x);
  87. }
  88. SegTree<Node, Mul> seg(n, a);
  89. while (m--)
  90. {
  91. int o, x, y;
  92. cin >> o >> x >> y;
  93. if(o == 1) {
  94. if(x > y) swap(x, y);
  95. cout << seg.rangeQuery(x, y).mx << endl;
  96. } else {
  97. seg.modify(x, Node(y));
  98. }
  99. }
  100. return 0;
  101. }