#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;
对于全部数据,1≤n,m≤212,1≤x,a,c≤n,1≤y,b,d≤m,∣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」打鼹鼠的主要内容,如果未能解决你的问题,请参考以下文章