2 条题解

  • 0
    @ 2025-10-8 17:04:00

    C93 二维树状数组 P4054 [JSOI2009] 计数问题

    #include <bits/stdc++.h>
    using namespace std;
    #define lowb(x) x & -x
    const int N=301;
    int n, m;
    int a[N][N],s[N][N][105];
    
    void change(int x, int y, int c, int k)
    {
        for (int i = x; i <= n; i += lowb(i))
            for (int j = y; j <= m; j += lowb(j))
                s[i][j][c] += k;
    }
    int query(int x, int y, int c)
    {
        int t = 0;
        for (int i = x; i; i -= lowb(i))
            for (int j = y; j; j -= lowb(j))
                t += s[i][j][c];
        return t;
    }
    int main()
    {
        scanf("%d%d", &n, &m);
        for (int i = 1, c; i <= n; ++i)
            for (int j = 1; j <= m; ++j)
            {
                scanf("%d", &c);
                a[i][j] = c;
                change(i, j, c, 1);
            }
        int q;scanf("%d", &q);
        while (q--)
        {
            int op, x1, y1, x2, y2, c;scanf("%d", &op);
            if (op == 1)
            {
                scanf("%d%d%d", &x1, &y1, &c);
                change(x1, y1, a[x1][y1], -1);
                a[x1][y1] = c;
                change(x1, y1, c, 1);
            }
            else
            {
                scanf("%d%d%d%d%d", &x1, &x2, &y1, &y2, &c);
                int ans = query(x2, y2, c) - query(x1 - 1, y2, c) - query(x2, y1 - 1, c) + query(x1 - 1, y1 - 1, c);
                printf("%d\n", ans);
            }
        }
    }
    
    • 0
      @ 2025-10-8 17:03:48

      C93 二维树状数组 P4054 [JSOI2009] 计数问题

      #include <bits/stdc++.h>
      using namespace std;
      #define lowb(x) x & -x
      const int N=301;
      int n, m;
      int a[N][N],s[N][N][105];
      
      void change(int x, int y, int c, int k)
      {
          for (int i = x; i <= n; i += lowb(i))
              for (int j = y; j <= m; j += lowb(j))
                  s[i][j][c] += k;
      }
      int query(int x, int y, int c)
      {
          int t = 0;
          for (int i = x; i; i -= lowb(i))
              for (int j = y; j; j -= lowb(j))
                  t += s[i][j][c];
          return t;
      }
      int main()
      {
          scanf("%d%d", &n, &m);
          for (int i = 1,c; i <= n; ++i)
              for (int j = 1; j <= m; ++j)
              {
                  scanf("%d", &c);
                  a[i][j] = c;
                  change(i, j, c, 1);
              }
          int q;scanf("%d", &q);
          while (q--)
          {
              int op,x1,y1,x2,y2,c;scanf("%d", &op);
              if (op == 1)
              {
                  scanf("%d%d%d", &x1, &y1, &c);
                  change(x1, y1, a[x1][y1], -1);
                  a[x1][y1] = c;
                  change(x1, y1, c, 1);
              }
              else
              {
                  scanf("%d%d%d%d%d", &x1, &x2, &y1, &y2, &c);
                  int ans = query(x2, y2, c) - query(x1 - 1, y2, c) - query(x2, y1 - 1, c) + query(x1 - 1, y1 - 1, c);
                  printf("%d\n", ans);
              }
          }
      }
      • 1

      C93【二维树状数组】二维单点修改+区间特定值个数查询[JSOI2009] 计数问题

      信息

      ID
      3105
      时间
      1000ms
      内存
      128MiB
      难度
      6
      标签
      递交数
      19
      已通过
      11
      上传者