标签:
题意:在一个S*S的正方形内,有两种操作2 X1 Y1 X2 Y2 查询(X1,X2) 到 (Y1,Y2) 这个矩形范围内手机的数量
而且数据的边界也是从0开始用树状数组的时候要加一处理
对于求矩形面积用一个大的矩形剪去三个边界的小矩形即可
ans=query(x2,y2)-query(x2,y1-1)-query(x1-1,y2)+query(x1-1,y1-1);
//4352K 547MS
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define M 1050
int tree[M][M],lim;
int lowbit(int x)
{
return x&-x;
}
void add(int x,int y,int val)
{
int tmp;
while(x<=lim){
tmp=y;
while(tmp<=lim){
tree[x][tmp]+=val;
tmp+=lowbit(tmp);
}
x+=lowbit(x);
}
}
int query(int x,int y)
{
int s=0;
while(x>0){
int tmp=y;
while(tmp>0){
s+=tree[x][tmp];
tmp-=lowbit(tmp);
}
x-=lowbit(x);
}
return s;
}
int main()
{
int op;
while(scanf("%d",&op)&&op!=3){
if(op==0){
scanf("%d",&lim);
lim++;
}
if(op==1){
int a,b,val;
scanf("%d%d%d",&a,&b,&val);
add(a+1,b+1,val);
}
if(op==2){
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1++;
y1++;
x2++;
y2++;
int ans=query(x2,y2)-query(x2,y1-1)-query(x1-1,y2)+query(x1-1,y1-1);
printf("%d\n",ans);
}
}
return 0;
}POJ 1195 Mobile phones (二维树状数组)
标签:
原文地址:http://blog.csdn.net/kalilili/article/details/43909095