POJ 1195 Mobile phones(二维树状数组)

来源:互联网 发布:淘宝宝贝描述上传图片 编辑:程序博客网 时间:2024/06/05 03:54
http://poj.org/problem?id=1195
裸的二维树状数组。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>
#include <stack>
#define maxn 10000+5
#define ull unsigned long long
#define ll long long
#define reP(i,n) for(i=1;i<=n;i++)
#define rep(i,n) for(i=0;i<n;i++)
#define cle(a) memset(a,0,sizeof(a))
#define mod 90001
#define PI 3.141592657
#define INF 1<<30
const ull inf = 1LL << 61;
const double eps=1e-5;

using namespace std;

bool cmp(int a,int b){
return a>b;
}
int c[1025][1025];
int n,d;
int lowbit(int i)
{
return i&(-i);
}
void add(int x,int y,int d)
{
int i=y;
while(x<=n)
{
y=i;
while(y<=n)
{
c[x][y]+=d;
y+=lowbit(y);
}
x+=lowbit(x);///注意这里的先后顺序
}
}
int sum(int x,int y)
{
int cnt=0,j=y;
while(x>0)
{
y=j;
while(y>0)
{
cnt+=c[x][y];
y-=lowbit(y);
}
x-=lowbit(x);
}
return cnt;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int a,x,y,z;
int l,b,r,t,k;
while(cin>>a)
{
if(a==0){scanf("%d",&n);cle(c);}
while(1)
{
scanf("%d",&k);
if(k==1)
{
scanf("%d%d%d",&x,&y,&d);
add(x+1,y+1,d);
}
else if(k==2)
{
scanf("%d%d%d%d",&l,&b,&r,&t);
l++,b++,r++,t++;
printf("%d\n",sum(r,t)+sum(l-1,b-1)-sum(l-1,t)-sum(r,b-1));///注意这里的面积求法
}
else if(k==3)return 0;
}
}
return 0;
}


0 0