1zoj 打鼹鼠|板子|二维树状数组

题目描述

打鼹鼠 题目描述

思路

二维树状数组板子题

代码

#include <cstdio>
#include <iostream>
using namespace std;
void read(int &n){
	int num=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') w=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		num=num*10+ch-'0';
		ch=getchar();
	}
	n=num*w;
}
const int maxn=10005;
int n,c[maxn][maxn];
int lowbit(int x){return x&(-x);}
void update(int x,int y,int v){
	for(int i=x;i<=n;i+=lowbit(i))
		for(int j=y;j<=n;j+=lowbit(j))
			c[i][j]+=v;
}
int query(int x,int y){
	int ans=0;
	for(int i=x;i;i-=lowbit(i))
		for(int j=y;j;j-=lowbit(j))
			ans+=c[i][j];
	return ans;
}
int main(){
	read(n);
	while(1){
		int m,x,y;read(m);
		switch(m){
			case 1:
				int v;read(x);read(y);read(v);
				update(x+1,y+1,v);
				break;
			case 2:
				int x1,y1;read(x);read(y);read(x1);read(y1);
				x++;y++;x1++;y1++;
				printf("%d
",query(x1,y1)-query(x1,y-1)+query(x-1,y-1)-query(x-1,y1));
				break;
			case 3:
				return 0;
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/saitoasuka/p/9977777.html