poj 1195
题意:一个n*n的矩阵,和几种动态操作,包括对某一点(x,y)值修改,查询子矩阵(x,y,xx,yy)的元素和。
思路:二维树状数组,典型的动态操作题目。查询子矩阵(x,y,xx,yy)的元素和,注意一下就可以了:
代码:
#include<iostream>
#include<fstream>
using namespace std;
int b[1025][1025];
int lowbit(int x){
return x&(-x);
}
int n;
void add(int x,int y,int s){
int i=y;
while(x<=n)
{
y=i;
while(y<=n)
{
b[x][y]+=s;
y+=lowbit(y);
}
x+=lowbit(x);
}
}
int getsum(int x,int y){
int i=0,j=y;
while(x>0)
{
y=j;
while(y>0)
{
i+=b[x][y];
y-=lowbit(y);
}
x-=lowbit(x);
}
return i;
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s,t,p;
cin>>i;
while(1){
if(i==3) return;
if(i==0)
{
cin>>n;
memset(b,0,sizeof(b));
}
else
if(i==1)
{
cin>>j>>k>>s;
j++;k++;
add(j,k,s);
}
else
if(i==2)
{
cin>>j>>k>>s>>t;
j++;k++;s++;t++;
p=getsum(s,t);
p+=getsum(j-1,k-1);
p-=getsum(s,k-1);
p-=getsum(j-1,t);
cout<<p<<endl;
}
cin>>i;
}
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号