您的位置:首页 > 其它

[Vijos1512] SuperBrother打鼹鼠 (二维树状数组)

2017-05-02 18:19 776 查看

传送门

 

直接搞就行。

注意下表re从零开始,而树状数组搞不了0,所以统一增加一个偏移量1.

(话说数据随机是什么鬼?)

# include <iostream>
# include <cstdio>
# include <cstring>
# include <string>
# include <cmath>
# include <vector>
# include <map>
# include <queue>
# include <cstdlib>
# define MAXN 1100
using namespace std;

inline int get_num() {
int k = 0, f = 1;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for(; isdigit(c); c = getchar()) k = k * 10 + c - '0';
return k * f;
}

int n;
int c[MAXN][MAXN];
inline int lowbit(int x)
{
return x & -x;
}

inline void add(int x, int y, int k)
{
int i, j;
for(i = x; i <= n; i += lowbit(i))
for(j = y; j <= n; j += lowbit(j))
c[i][j] += k;
}

inline int query(int x, int y)
{
int i, j, ans = 0;
for(i = x; i; i -= lowbit(i))
for(j = y; j; j -= lowbit(j))
ans += c[i][j];
return ans;
}

int main()
{
int i, x, y, k, x1, x2, y1, y2, m;
n = get_num() + 1;
while(1)
{
m = get_num();
if(m == 3) break;
if(m == 1)
{
x = get_num() + 1;
y = get_num() + 1;
k = get_num();
add(x, y, k);
}
else
{
x1 = get_num() + 1;
y1 = get_num() + 1;
x2 = get_num() + 1;
y2 = get_num() + 1;
printf("%d\n", query(x2, y2) - query(x1 - 1, y2) - query(x2, y1 - 1) + query(x1 - 1, y1 - 1));
}
}
return 0;
}
View Code

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: