码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-08-29 23:42:02      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:lld   操作   div   正整数   pen   模板   data-   bsp   size   

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」打鼹鼠

标签:lld   操作   div   正整数   pen   模板   data-   bsp   size   

原文地址:https://www.cnblogs.com/fdezlsq/p/11432306.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!