1 条题解

  • 0
    @ 2025-9-10 8:58:59

    C++ :

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    
    using namespace std;
    
    typedef unsigned long long ullong;
    #define lson l, m, rt << 1
    #define rson m + 1, r, rt << 1 | 1
    
    const int N = (int)(1e5 + 10);
    const ullong MOD = (1ULL << 32);
    
    struct Mat {
      ullong matrix[3][3];
      bool hasV;
    
      Mat() {
        memset(matrix, 0, sizeof(matrix));
        for (int i = 0; i < 3; i++)
          matrix[i][i] = 1;
        hasV = false;
      }
    
      Mat(ullong p, ullong q, ullong r, ullong s) {
        matrix[0][0] = (p * p) % MOD;
        matrix[0][1] = (2ULL * (p * q) % MOD) % MOD;
        matrix[0][2] = (q * q) % MOD;
        matrix[1][0] = (p * r) % MOD;
        matrix[1][1] = ((p * s) % MOD + (q * r) % MOD) % MOD;
        matrix[1][2] = (q * s) % MOD;
        matrix[2][0] = (r * r) % MOD;
        matrix[2][1] = (2ULL * (r * s) % MOD) % MOD;
        matrix[2][2] = (s * s) % MOD;
        hasV = true;
      }
    
      Mat mul(Mat t) {
        Mat c = Mat();
        for (int i = 0; i < 3; i++) {
          for (int j = 0; j < 3; j++) {
            c.matrix[i][j] = 0;
            for (int k = 0; k < 3; k++) {
              c.matrix[i][j] = (c.matrix[i][j] + 
                (t.matrix[i][k] * matrix[k][j]) % MOD) % MOD;
            }
          }
        }
        c.hasV = true;
        return c;
      }
    
      void show() {
        // for (int i = 0; i < 3; i++) {
        //   for (int j = 0; j < 3; j++)
        //     cout << matrix[i][j] << " ";
        //   cout << endl;
        // }
      }
    };
    
    struct Node {
      ullong val[3];
    
      Node() {
        memset(val, 0, sizeof(val));
      }
    
      Node(ullong x1, ullong x2, ullong x3) {
        val[0] = x1;
        val[1] = x2;
        val[2] = x3;
      }
    
      Node add(Node t) {
        return Node(
          (t.val[0] + val[0]) % MOD, 
          (t.val[1] + val[1]) % MOD,
          (t.val[2] + val[2]) % MOD);
      }
    
      Node mulMat(Mat a) {
        Node c = Node();
        for (int i = 0; i < 3; i++) {
          for (int k = 0; k < 3; k++) {
            c.val[i] = (c.val[i] + (a.matrix[i][k] * val[k]) % MOD) % MOD;
          }
        }
        return c;
      }
    
    };
    
    ullong a[N];
    ullong b[N];
    Node node[N << 2];
    Mat lazy[N << 2];
    
    void pushup(int rt) {
      node[rt] = node[rt << 1].add(node[rt << 1 | 1]);
    }
    
    void pushdown(int rt) {
      if (lazy[rt].hasV) {
        lazy[rt << 1] = lazy[rt << 1].mul(lazy[rt]);
        lazy[rt << 1 | 1] = lazy[rt << 1 | 1].mul(lazy[rt]);
        node[rt << 1] = node[rt << 1].mulMat(lazy[rt]);
        node[rt << 1 | 1] = node[rt << 1 | 1].mulMat(lazy[rt]);
        lazy[rt] = Mat();
      }
    }
    
    void build(int l, int r, int rt) {
      lazy[rt] = Mat();
      if (l == r) {
        node[rt] = Node((a[l] * a[l]) % MOD, (a[l] * b[l]) % MOD, (b[l] * b[l]) % MOD);
        return ;
      }
      int m = (l + r) >> 1;
      build(lson);
      build(rson);
      pushup(rt);
    }
    
    void update(int L, int R, Mat add, int l, int r, int rt) {
      // cout << l << " " << r << endl;
      if (L <= l && r <= R) {
        node[rt] = node[rt].mulMat(add);
        // cout << "before " << endl;
        // lazy[rt].show();
        // add.show();
        lazy[rt] = lazy[rt].mul(add);
        // cout << "after " << endl;
        // lazy[rt].show();
        // cout << endl;
        return ;
      }
      // lazy[rt].show();
      // cout << endl;
      int m = (l + r) >> 1;
      pushdown(rt);
      if (L <= m)
        update(L, R, add, lson);
      if (R > m)
        update(L, R, add, rson);
      pushup(rt);
    }
    
    ullong query(int L, int R, int l, int r, int rt) {
      if (L <= l && r <= R) {
        return node[rt].val[1];
      }
      int m = (l + r) >> 1;
      ullong sum = 0;
      pushdown(rt);
      if (L <= m)
        sum = (sum + query(L, R, lson)) % MOD;
      if (R > m)
        sum = (sum + query(L, R, rson)) % MOD;
      pushup(rt);
      return sum;
    }
    
    int main() {
      // freopen("rda.in", "r", stdin);
      int n, m;
      scanf("%d %d", &n, &m);
      for (int i = 1; i <= n; i++) 
        scanf("%llu", &a[i]);
      for (int i = 1; i <= n; i++)
        scanf("%llu", &b[i]);
      build(1, n, 1);
      for (int i = 0; i < m; i++) {
        int qs, ll, rr;
        scanf("%d%d%d", &qs, &ll, &rr);
        if (qs == 1) {
          ullong p, q, r, s;
          scanf("%llu %llu %llu %llu", &p, &q, &r, &s);
          Mat add = Mat(p, q, r, s);
          update(ll, rr, add, 1, n, 1);
        }
        else if (qs == 2) {
          ullong res = query(ll, rr, 1, n, 1);
          printf("%llu\n", res);
        }
        else {
          return -1;
        }
        // cout << query(1, n, 1, n, 1) << endl; 
      }
      return 0;
    }
    
    • 1

    信息

    ID
    3511
    时间
    10000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者