2 条题解

  • 0
    @ 2025-6-1 9:28:33

    满分代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    const int MAXN = (1 << 12) + 5; // 最大行数、列数上限:2^12 + 余量
    
    int n, m;                     // 矩阵行数n,列数m
    long long bit[MAXN][MAXN];    // 二维树状数组,存储差分信息,1-based
    
    // lowbit:返回 x 的最低位 1 对应的值,用于 Fenwick Tree 跳跃
    inline int lb(int x) {
        return x & -x;
    }
    
    // upd2:二维树状数组单点更新,在 (x,y) 位置增加 val
    // 名称长度 <=7
    void upd2(int x, int y, long long val) {
        // 外层循环:对行进行跳跃更新
        for (int i = x; i <= n; i += lb(i)) {
            // 内层循环:对列进行跳跃更新
            for (int j = y; j <= m; j += lb(j)) {
                bit[i][j] += val;
            }
        }
    }
    
    // qry2:查询 (1,1) 到 (x,y) 矩形区域的前缀和
    // 名称长度 <=7
    long long qry2(int x, int y) {
        long long s = 0;
        // 外层循环:对行进行累加
        for (int i = x; i > 0; i -= lb(i)) {
            // 内层循环:对列进行累加
            for (int j = y; j > 0; j -= lb(j)) {
                s += bit[i][j];
            }
        }
        return s;
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        // 读入行数 n 和列数 m
        cin >> n >> m;
        // 初始化树状数组为 0
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                bit[i][j] = 0;
            }
        }
    
        // 读取操作直到文件结束
        // opType = 1 表示单点加操作,=2 表示子矩阵求和
        int opType;
        while ( (cin >> opType) ) {
            if (opType == 1) {
                // 格式:1 x y k —— 在 A[x][y] 上增加 k
                int x, y;
                long long k;
                cin >> x >> y >> k;
                // 用 upd2 在 (x,y) 位置加上 k
                upd2(x, y, k);
            } else if (opType == 2) {
                // 格式:2 a b c d —— 查询子矩阵 (a,b) 到 (c,d) 的元素和
                int a, b, c, d;
                cin >> a >> b >> c >> d;
                // 子矩阵和 = qry2(c,d) - qry2(a-1,d) - qry2(c,b-1) + qry2(a-1,b-1)
                long long ans = qry2(c, d)
                              - qry2(a - 1, d)
                              - qry2(c, b - 1)
                              + qry2(a - 1, b - 1);
                cout << ans << "\n";
            }
            // 其他 opType 不存在,直接忽略
        }
    
        return 0;
    }
    
    
    • 0
      @ 2025-3-24 18:21:44
      #include<bits/stdc++.h>
      using namespace std;
      long long a[4097][4097];
      int n,m;
      void Add(int x,int y,int p){
          for(int i=x;i<=n;i+=i&(-i))for(int j=y;j<=m;j+=j&(-j))a[i][j]+=p;
      }
      long long Que(int x,int y){
          long long res=0;
          for(int i=x;i;i-=i&(-i))for(int j=y;j;j-=j&(-j))res+=a[i][j];
          return res;
      }
      int main(){
          //freopen("test.in","r",stdin);
          scanf("%d%d",&n,&m);int op;
          while(scanf("%d",&op)!=EOF){
              if(op-1){
                  int a,b,c,d;
                  scanf("%d%d%d%d",&a,&b,&c,&d);
                  printf("%lld\n",Que(c,d)-Que(c,b-1)-Que(a-1,d)+Que(a-1,b-1));
              }
              else{
                  int x,y,k;
                  scanf("%d%d%d",&x,&y,&k);
                  Add(x,y,k);
              }
          }
          return 0;
      }
      
      
      • 1

      信息

      ID
      996
      时间
      1000ms
      内存
      512MiB
      难度
      10
      标签
      (无)
      递交数
      7
      已通过
      3
      上传者