zoukankan      html  css  js  c++  java
  • 二维树状数组 BZOJ 1452 [JSOI2009]Count

    题目链接

    裸二维树状数组

    #include <bits/stdc++.h>
     
    const int N = 305;
    struct BIT_2D {
        int c[105][N][N], n, m;
        void init(int n, int m) {
            memset (c, 0, sizeof (c));
            this->n = n;
            this->m = m;
        }
        void updata(int k, int x, int y, int z) {
            for (int i=x; i<=n; i+=i&(-i)) {
                for (int j=y; j<=m; j+=j&(-j)) {
                    c[k][i][j] += z;
                }
            }
        }
        int query(int k, int x, int y) {
            int ret = 0;
            for (int i=x; i; i-=i&(-i)) {
                for (int j=y; j; j-=j&(-j)) {
                    ret += c[k][i][j];
                }
            }
            return ret;
        }
        int count(int x1, int x2, int y1, int y2, int a) {
            return query (a, x2, y2) - query (a, x2, y1-1) - query (a, x1-1, y2) + query (a, x1-1, y1-1);
        }
    };
     
    int a[N][N];
    BIT_2D bit;
     
    int read() {
        int ret = 0, f = 1;
        char ch = getchar ();
        while (ch < '0' || ch > '9') {
            if (ch == '-') {
                f = -1;
            }
            ch = getchar ();
        }
        while (ch >= '0' && ch <= '9') {
            ret = ret * 10 + ch - '0';
            ch = getchar ();
        }
        return ret * f;
    }
    
    int main() {
        int n, m;
        while (scanf ("%d%d", &n, &m) == 2) {
            bit.init (n, m);
            for (int i=1; i<=n; ++i) {
                for (int j=1; j<=m; ++j) {
                    //scanf ("%d", &a[i][j]);
                    a[i][j] = read ();
                    bit.updata (a[i][j], i, j, 1);
                }
            }
            int q;
            scanf ("%d", &q);
            while (q--) {
                int op, x1, x2, y1, y2, x;
                scanf ("%d", &op);
                if (op == 1) {
                    //scanf ("%d%d%d", &x1, &y1, &x);
                    x1 = read (); y1 = read (); x = read ();
                    bit.updata (a[x1][y1], x1, y1, -1);
                    a[x1][y1] = x;
                    bit.updata (a[x1][y1], x1, y1, 1);
                } else {
                    //scanf ("%d%d%d%d%d", &x1, &x2, &y1, &y2, &x);
                    x1 = read (); x2 = read (); y1 = read (); y2 = read (); x = read ();
                    printf ("%d
    ", bit.count (x1, x2, y1, y2, x));
                }
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    Android 代码规范大全
    python爬虫学习系列
    python接口测试(requests+excel)
    Jenkins系列
    postman系列
    利用Faker生成常用的测试数据
    python基础在实际写脚本过程中的一些简单运用(一)
    charles实践-通过断点调试修改request
    关于fiddler抓包的一些配置
    c#winform主题实现的一个方法
  • 原文地址:https://www.cnblogs.com/Running-Time/p/5503298.html
Copyright © 2011-2022 走看看