【VIJOS】P1512SuperBrother打鼴鼠

背景

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,輸出一行數,這行數只有一個數,即所詢問的區域內鼴鼠的個數。

樣例1

樣例輸入1[複製]

4
1 2 2 5
2 0 0 2 3
3

樣例輸出1[複製]

5

限制

各個測試點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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章