题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1452

题意:给出一个数字矩阵(矩阵中任何时候的数字均为[1,100]),两种操作:(1)修改某个位置的数字;(2)求某个子矩阵中某个数字的个数。

思路:二维树状数组的操作看起来跟一维的差不多,只是循环改为两重而已。主要操作有:(1)增加某个位置的值;(2)询问[1,1,x,y]子矩阵的和。利用(2)操作以及区间的减法操作我们能求出任意一个子矩阵的数字和。这道题用a[i][x][y]来记录关于数字i的信息。

int a[105][N][N];

void add(int a[N][N],int x,int y,int t)
{
    int i,j;
    for(i=x;i<N;i+=i&-i) for(j=y;j<N;j+=j&-j)
    {
        a[i][j]+=t;
    }
}

int query(int a[N][N],int x,int y)
{
    int ans=0,i,j;
    for(i=x;i;i-=i&-i) for(j=y;j;j-=j&-j)
    {
        ans+=a[i][j];
    }
    return ans;
}

int query(int a[N][N],int x1,int y1,int x2,int y2)
{
    return query(a,x2,y2)-query(a,x1-1,y2)-query(a,x2,y1-1)+query(a,x1-1,y1-1);
}

int n,m;
int b[N][N];

int main()
{
    Rush(n)
    {
        RD(m); clr(a,0);
        int i,j,x;
        FOR1(i,n) FOR1(j,m)
        {
            RD(x);
            add(a[x],i,j,1);
            b[i][j]=x;
        }
        int Q;
        RD(Q);
        int op,x1,x2,y1,y2,c;
        while(Q--)
        {
            RD(op);
            if(op==1)
            {
                RD(x1,y1,c);
                add(a[b[x1][y1]],x1,y1,-1);
                b[x1][y1]=c;
                add(a[c],x1,y1,1);
            }
            else
            {
                RD(x1,x2); RD(y1,y2); RD(c);
                PR(query(a[c],x1,y1,x2,y2));
            }
        }
    }
}

BZOJ 1452 Count(二维树状数组)的更多相关文章

  1. BZOJ 1452 Count(二维树状数组)

    大水题. 建立100个二维树状数组,总复杂度就是O(qlognlogm). # include <cstdio> # include <cstring> # include & ...

  2. bzoj 1452: [JSOI2009]Count ——二维树状数组

    escription Input Output Sample Input Sample Output 1 2 HINT ———————————————————————————————————————— ...

  3. bzoj1452 [JSOI2009]Count ——二维树状数组

    中文题面,给你一个矩阵,每一个格子有数字,有两种操作. 1. 把i行j列的值更改 2. 询问两个角坐标分别为(x1,y1) (x2,y2)的矩形内有几个值为z的点. 这一题的特点就是给出的z的数据范围 ...

  4. 【bzoj1452】[JSOI2009]Count 二维树状数组

    题目描述 输入 输出 样例输入 样例输出 1 2 题解 二维树状数组 一开始没看到 1≤c≤100 ,想到了主X树和X块,结果发现c的范围那么小... 二维树状数组水题,和一维的一样,向上修改,向下查 ...

  5. BZOJ 1452: [JSOI2009]Count 二维树状数组

    1452: [JSOI2009]Count Description Input Output Sample Input Sample Output 1 2 HINT Source 题解:设定C[101 ...

  6. Count(二维树状数组)

    [bzoj1452][JSOI2009]Count Description Input Output Sample Input Sample Output 12   HINT 题解:对于每一个颜色建一 ...

  7. 二维树状数组 BZOJ 1452 [JSOI2009]Count

    题目链接 裸二维树状数组 #include <bits/stdc++.h> const int N = 305; struct BIT_2D { int c[105][N][N], n, ...

  8. bzoj 1452: [JSOI2009]Count (二维树状数组)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1452 思路: 对每个颜色开一个二维树状数组维护就好了 实现代码: #include<b ...

  9. BZOJ 1452 Count 【模板】二维树状数组

    对每种颜色开一个二维树状数组 #include<cstdio> #include<algorithm> using namespace std; ; ][maxn][maxn] ...

随机推荐

  1. Ubuntu 下编译安装linux

    1. 准备工作切换为管理员权限,sudo –i 输入用户密码 进入root 权限apt-get install build-essential kernel-package libncurses5-d ...

  2. bzoj 2327 构图暴力判断+独立集个数

    首先我们可以处理出10^6以内的所有的勾股数,如果我们有2*i-1和2*j互质, 那么A=(2*i-1)*(2*i-1)+(2*i-1)*(2*j),B=2*j*j+(2*i-1)*(2*j)为互质 ...

  3. poj 1300 Door Man 欧拉回路

    题目链接:http://poj.org/problem?id=1300 You are a butler in a large mansion. This mansion has so many ro ...

  4. 原生js实现中文时钟

    零.寒暄 终于一个月可以更新两篇博客了,开心.昨天花了大概一天的时间玩了下github,基本的clone和push都搞定了,如果有和我一样的新手没调通的,大家可以交流. 另外,说个题外话,大家发现我的 ...

  5. VC++之GetLastError()使用说明

    VC中GetLastError()获取错误信息的使用 在VC中编写应用程序时,经常需要涉及到错误处理问题.许多函数调用只用TRUE和FALSE来表明函数的运行结果.一旦出现错误,MSDN中往往会指出请 ...

  6. .NET设计模式(12):外观模式(Façade Pattern)(转)

    概述 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依 ...

  7. hive的学习入门(飞进数据仓库的小蜜蜂)

    前言 hive是构建在Hadoop上的数据仓库平台,其设计目标是:使Hadoop上的数据操作与传统的SQL结合,让熟悉sql的开发人员能够轻松的像Hadoop平台迁移. Hive是Facebook的信 ...

  8. jQuery打印插件PrintArea实现

    实现javascript打印功能,打印整个页面就很简单,但如果指定打印某一个区域就有点难点,这里有一个jQuery插件PrintArea可实现打印页面某区域功能. 使用说明需要使用jQuery库文件和 ...

  9. 本地搭建Dubbo监控中心的安装步骤

    Dubbo监控中心的安装步骤 参考链接:http://blog.csdn.net/lichunan/article/details/40349645 一.从github上下载dubbo源码进行编译: ...

  10. 迁移到MariaDB galera

    迁移到MariaDB galera [已注销] [已注销] -- :: [安装] ====== https://downloads.mariadb.org/mariadb/repositories/ ...