背景
SuperBrother在機房裏閒着沒事幹(再對比一下他的NOIP,真是諷刺啊......),於是便無聊地開始玩“打鼴鼠”......
描述
在這個“打鼴鼠”的遊戲中,鼴鼠會不時地從洞中鑽出來,不過不會從洞口鑽進去(鼴鼠真膽大……)。洞口都在一個大小爲n(n<=1024)的正方形中。這個正方形在一個平面直角座標系中,左下角爲(0,0),右上角爲(n-1,n-1)。洞口所在的位置都是整點,就是橫縱座標都爲整數的點。而SuperBrother也不時地會想知道某一個範圍的鼴鼠總數。這就是你的任務。
格式
輸入格式
每個輸入文件有多行。
第一行,一個數n,表示鼴鼠的範圍。
以後每一行開頭都有一個數m,表示不同的操作:
m=1,那麼後面跟着3個數x,y,k(0<=x,y<n),表示在點(x,y)處新出現了k只鼴鼠;
m=2,那麼後面跟着4個數x1,y1,x2,y2(0<=x1<=x2<n,0<=y1<=y2<n),表示詢問矩形(x1,y1)-(x2,y2)內的鼴鼠數量;
m=3,表示老師來了,不能玩了。保證這個數會在輸入的最後一行。
詢問數不會超過10000,鼴鼠數不會超過maxlongint。
輸出格式
對於每個m=2,輸出一行數,這行數只有一個數,即所詢問的區域內鼴鼠的個數。
限制
各個測試點1s
提示
水題一道。
所有數據均爲隨機生成,包括樣例……
題解:
二維樹狀數組,查詢相當於矩陣前綴和之後做差。。有種容斥的感覺……
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 1025;
int a[MAXN][MAXN], Tree[MAXN][MAXN];
int n, m;
inline int lowbit(int x)
{
return x&(-x);
}
inline void Modify(int x,int y,int tar)
{
int i, j;
for (i = x; i <= n; i+=lowbit(i))
for (j = y; j <= m; j+=lowbit(j))
Tree[i][j] += tar;
}
inline int Query(int x, int y)
{
int i, j;
int ans = 0;
for (i = x; i; i -= lowbit(i))
for (j = y; j; j -= lowbit(j))
ans += Tree[i][j];
return ans;
}
int main(int argc, char *argv[])
{
int i, j, x, y, c;
int x1, x2, y1, y2;
int op;
int ans;
scanf("%d", &n);
m = n;
while (cin>>op)
{
if (op == 3) return 0;
if (op == 1)
{
scanf("%d%d%d", &x, &y, &c);
Modify(x+1, y+1, c);
}
else
{
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
ans = Query(x1, y1) + Query(x2+1, y2+1) - Query(x1, y2+1) - Query(x2+1, y1);
printf("%d\n", ans);
}
}
return 0;
}