基础
模类
constexpr int P = 1000000007;// assume -P <= x < 2Pint norm(int x) { if (x < 0) x += P; else if (x >= P) x -= P; return x; }// 快速幂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; }struct Mint {int x;Mint(int x = 0) : x(norm(x)) {}int val() const { return x; }Mint operator-() const { return Mint(norm(P - x)); }Mint inv() const { assert(x != 0); return power(*this, P - 2); }Mint &operator*=(const Mint &rhs) { x = ll(x) * rhs.x % P; return *this; }Mint &operator+=(const Mint &rhs) { x = norm(x + rhs.x); return *this; }Mint &operator-=(const Mint &rhs) { x = norm(x - rhs.x); return *this; }Mint &operator/=(const Mint &rhs) { return *this *= rhs.inv(); }friend Mint operator*(const Mint &lhs, const Mint &rhs) { Mint res = lhs; res *= rhs; return res; }friend Mint operator+(const Mint &lhs, const Mint &rhs) { Mint res = lhs; res += rhs; return res; }friend Mint operator-(const Mint &lhs, const Mint &rhs) { Mint res = lhs; res -= rhs; return res; }friend Mint operator/(const Mint &lhs, const Mint &rhs) { Mint res = lhs; res /= rhs; return res; }};// 阶乘和逆元Mint fac[N], inv[N];inline Mint C(int A, int B){ return fac[A] * inv[B] * inv[A - B]; }/*** main ***/n = N - 1;fac[0] = 1;rep(i,1,n) fac[i] = fac[i-1] * i;inv[n] = fac[n].inv();per(i,n-1,0) inv[i] = inv[i+1] * (i + 1);/*** endmain ***/
数据结构
树状数组
template <typename T>struct Fenwick {const int n;vector<T> a;Fenwick(int n): n(n), a(n + 1) {}void add(int x, T v){for(int i = x; i <= n; i += i & -i) a[i] += v;}T sum(int x) {T rs = 0;for(int i = x; i; i -= i & -i) {rs += a[i];}return rs;}T rangeSum(int l, int r) {if(l > r) return 0;return sum(r) - sum(l - 1);}};
线段树
http://oj.daimayuan.top/problem/813
#include<bits/stdc++.h>using namespace std;#define dbg(x...) do { cout << "\033[32;1m" << #x <<" -> "; err(x); } while (0)void err() { cout << "\033[39;0m" << endl; }template<class T, class... Ts> void err(const T& arg,const Ts&... args) { cout << arg << " "; err(args...); }#define rep(i,j,k) for(int i=int(j);i<=int(k);i++)#define per(i,j,k) for(int i=int(j);i>=int(k);i--)typedef long long ll;const int inf = 1E9;template<class Info, class Merge = plus<Info>>struct SegTree{const int n;const Merge merge;vector<Info> info;SegTree(int n): n(n), merge(Merge()), info(4 * n) {}SegTree(int n, vector<Info>& init): SegTree(n) {function<void(int,int,int)> build = [&](int p, int l, int r) {if(l == r) {info[p] = init[l];return;}int m = (l + r) / 2;build(2 * p, l, m);build(2 * p + 1, m + 1, r);pull(p);};build(1, 1, n);}void pull(int p) {info[p] = merge(info[2 * p], info[2 * p + 1]);}void modify(int p, int l, int r, int x, const Info &v) {if(l == r) {info[p] = v;return;}int m = (l + r) / 2;if(x <= m) modify(p * 2, l, m, x, v);else modify(2 * p + 1, m + 1, r, x, v);pull(p);}void modify(int p, const Info &v) {modify(1, 1, n, p, v);}Info rangeQuery(int p, int l, int r, int x, int y) {if(l > y || r < x) {return Info();}if(l >= x && r <= y) return info[p];int m = (l + r) / 2;return merge(rangeQuery(p * 2, l, m, x, y), rangeQuery(p * 2 + 1, m + 1, r, x, y));}Info rangeQuery(int l, int r) {return rangeQuery(1, 1, n, l, r);}};// 创建结点信息、*运算struct Node {int ls, rs, mx, sum;Node() {Node(-inf);sum = 0;}Node(int val):ls(val),rs(val),mx(val),sum(val){}};Node operator * (const Node &l, const Node &r) {Node t;t.sum = l.sum + r.sum;t.mx = max(l.rs + r.ls, max(l.mx, r.mx));t.ls = max(l.ls, l.sum + r.ls);t.rs = max(r.rs, r.sum + l.rs);return t;}struct Mul {Node operator () (const Node &l, const Node &r) const {return l * r;}};int main() {ios::sync_with_stdio(false); cin.tie(nullptr);int n, m;cin >> n >> m;vector<Node> a(n + 1);rep(i,1,n) {int x; cin >> x;a[i] = Node(x);}SegTree<Node, Mul> seg(n, a);while (m--){int o, x, y;cin >> o >> x >> y;if(o == 1) {if(x > y) swap(x, y);cout << seg.rangeQuery(x, y).mx << endl;} else {seg.modify(x, Node(y));}}return 0;}
