2 条题解
-
-2
各位帅哥,帮我看看,为啥TLE60!!!
#include <bits/stdc++.h> using namespace std; int n, m, mod; struct Matrix { long long a[3][3]; Matrix() { a[1][1] = a[2][2] = 1; a[1][2] = a[2][1] = 0; } Matrix operator*(const Matrix& b) { Matrix res; for (int i = 1; i <= 2; i++) { for (int j = 1; j <= 2; j++) { res.a[i][j] = 0; for (int k = 1; k <= 2; k++) { res.a[i][j] += a[i][k] * b.a[k][j] % mod; } res.a[i][j] %= mod; } } return res; } bool flag() { if (a[1][1] == 1 && a[1][2] == 0 && a[2][1] == 0 && a[2][2] == 1) { return false; } return true; } }; struct Segtree { std::vector<long long> tree; std::vector<Matrix> lazy; void init(std::vector<long long> &a) { tree.resize(4 * n + 1); lazy.resize(4 * n + 1); build(1, 1, n, a); } void build(int p, int l, int r, std::vector<long long> &a) { if (l == r) { tree[p] = a[l]; return; } int mid = (l + r) / 2; build(p * 2, l, mid, a); build(p * 2 + 1, mid + 1, r, a); tree[p] = (tree[p * 2] + tree[p * 2 + 1]) % mod; } void pushdown(int p, int l, int r) { if (lazy[p].flag()) { int mid = (l + r) / 2; tree[p * 2] = (tree[p * 2] * lazy[p].a[1][1] + lazy[p].a[1][2] * (mid - l + 1)) % mod; tree[p * 2 + 1] = (tree[p * 2 + 1] * lazy[p].a[1][1] + lazy[p].a[1][2] * (r - mid)) % mod; lazy[p * 2] = lazy[p] * lazy[p * 2] ; lazy[p * 2 + 1] = lazy[p] * lazy[p * 2 + 1] ; lazy[p] = Matrix(); } } void update(int p, int l, int r, int ql, int qr, Matrix val) { if (l > qr || r < ql) { return; } if (l >= ql && r <= qr) { tree[p] = (tree[p] * val.a[1][1] + val.a[1][2] * (r - l + 1)) % mod; lazy[p] = val * lazy[p]; return; } pushdown(p, l, r); int mid = (l + r) / 2; update(p * 2, l, mid, ql, qr, val); update(p * 2 + 1, mid + 1, r, ql, qr, val); tree[p] = (tree[p * 2] + tree[p * 2 + 1]) % mod; } long long query(int p, int l, int r, int ql, int qr) { if (l > qr || r < ql) { return 0; } if (l >= ql && r <= qr) { return tree[p]; } pushdown(p, l, r); int mid = (l + r) / 2; return (query(p * 2, l, mid, ql, qr) + query(p * 2 + 1, mid + 1, r, ql, qr)) % mod; } } tree; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); std::cin >> n >> m >> mod; std::vector<long long> a(n + 1); for (int i = 1; i <= n; i++) { std::cin >> a[i]; } tree.init(a); Matrix val; for (int i = 1; i <= m; i++) { long long op, l, r, k; std::cin >> op >> l >> r; if (op == 1) { std::cin >> k; val.a[1][1] = k; val.a[1][2] = 0; tree.update(1, 1, n, l, r, val); } else if (op == 2) { std::cin >> k; val.a[1][1] = 1; val.a[1][2] = k; tree.update(1, 1, n, l, r, val); } else { std::cout << tree.query(1, 1, n, l, r) << '\n'; } } return 0; }
信息
- ID
- 2432
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 6
- 标签
- 递交数
- 28
- 已通过
- 10
- 上传者