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

14 篇文章 0 订阅
1 篇文章 0 订阅

Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 2544 Solved: 1482

Description

这里写图片描述

Input

这里写图片描述

Output

这里写图片描述

Sample Input

这里写图片描述

Sample Output

1

2

HINT

这里写图片描述


题解:

发现权值比较小,于是直接二维树状数组,这是我第一次写二维树状数组,好神奇啊就是多了一个for循环而已,直接就可以维护前缀区间了,真是666,没有学过二维树状数组的朋友看代码之后一定可以懂的


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int C[111][333][333], mp[333][333], n, m, q;
inline int lowbit( int x ){ return x & ( -x ); }
void modify( int x, int y, int c, int val ) {
    for( register int i = x; i <= n; i += lowbit(i) ) 
        for( register int j = y; j <= m; j += lowbit(j) )
            C[c][i][j] += val;
}
int query( int x, int y, int c ) {
    int tmp = 0;
    for( register int i = x; i ; i -= lowbit(i) )
        for( register int j = y; j ; j -= lowbit(j) )
            tmp += C[c][i][j];
    return tmp;
}
int main( ) {
    scanf( "%d%d", &n, &m );
    for( register int i = 1; i <= n; i++ ) 
        for( register int j = 1; j <= m; j++ ) {
            scanf( "%d", &mp[i][j] );
            modify( i, j, mp[i][j], 1 );
        }
    scanf( "%d", &q );
    for( register int i = 1; i <= q; i++ ) { int opt, x1, y1, x2, y2, c;
        scanf( "%d", &opt );
        if( opt == 1 ) {
            scanf( "%d%d%d", &x1, &y1, &c );
            modify( x1, y1, mp[x1][y1], -1 );
            mp[x1][y1] = c;
            modify( x1, y1, mp[x1][y1], 1 );
        } else {
            scanf( "%d%d%d%d%d", &x1, &x2, &y1, &y2, &c );
            int ans = 0;
            ans = query( x2, y2, c ) + query( x1 - 1, y1 - 1, c );
            ans -= query( x1 - 1, y2, c );
            ans -= query( x2, y1 - 1, c );
            printf( "%d\n", ans );
        }
    }
    return 0;
}

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值