#10118 「一本通 4.1 练习 3」打鼹鼠

Posted fdezlsq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#10118 「一本通 4.1 练习 3」打鼹鼠相关的知识,希望对你有一定的参考价值。

1540:打鼹鼠_二维树状数组


时间限制: 1000 ms         内存限制: 524288 KB
提交数: 439     通过数: 96 

【题目描述】

这是一道模板题。

给出一个 n×mn×m 的零矩阵 AA,你需要完成如下操作:

1 x y k1 x y k:表示元素 Ax,yAx,y自增 kk;

2 a b c d2 a b c d:表示询问左上角为 (a,ba,b),右下角为 (c,dc,d) 的子矩阵内所有数的和。

【输入】

输入的第一行有两个正整数 n,mn,m;

接下来若干行,每行一个操作,直到文件结束。

【输出】

对于每个 22 操作,输出一个整数,表示对于这个操作的回答。

【输入样例】

2 2
1 1 1 3
1 2 2 4
2 1 1 2 2

【输出样例】

7

【提示】

数据范围与提示:

对于 10% 的数据,n=1n=1;

对于另 10% 的数据,m=1m=1;

对于全部数据,1n,m212,1x,a,cn,1y,b,dm,k∣≤1051≤n,m≤212,1≤x,a,c≤n,1≤y,b,d≤m,∣k∣≤105 ,保证操作数目不超过 3×1053×105 ,且询问的子矩阵存在。

【来源】


 

#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;

 

 

 

 

以上是关于#10118 「一本通 4.1 练习 3」打鼹鼠的主要内容,如果未能解决你的问题,请参考以下文章

#10117 「一本通 4.1 练习 2」简单题

#10116 「一本通 4.1 练习 1」清点人数

loj10141. 「一本通 4.5 练习 3」染色

loj #10134. 「一本通 4.4 练习 1」Dis

「一本通 1.1 练习 1」数列极差

SPFA算法的SLF优化 ——loj#10081. 「一本通 3.2 练习 7」道路和航线