您的位置:首页 > 其它

HDU 1892 See you~ (二维树状数组)

2015-06-05 14:43 441 查看
题目链接: 戳我

题目大意:

给你一个书架, 1000*1000的矩阵,即格子.每个格子初始化都是1, 有下面几种操作:

S x1 y1 x2 y2 意思是你应该告诉我 以(X1,Y1),(X2,Y2)作为对角线,包括两点的矩形的总共有多少书。坑点: (x1, y1) 这个点不一定比 (x2, y2)这个点的小
A x1 y1 n1 意思是在(x1, y1) 这个位置放 n1 本书

D x1 y1 n1 意思是在 位置(X1,Y1)拿走 n1 本书,如果在那个位置上的书低于n1,则搬开所有的书。 反正不能出现负数
M x1 y1 x2 y2 n1 把(x1, y1)这个位置的 n1 本书 移动到 (x2, y2) 这个位置. 如果在那个位置上的书低于n1,则移走所有的书

注意: 0<=x1,y1,x2,y2<=1000,1<=n1<=100.

简单的二维树状数组.

//Author LJH
//www.cnblogs.com/tenlee
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#define clc(a, b) memset(a, b, sizeof(a))
using namespace std;

const int inf = 0x3f;
const int INF = 0x3f3f3f3f;
const int maxn = 1e3+5;

int a[maxn][maxn];

int lowbit(int x)
{
return x & -x;
}

void Add(int x, int y, int val)
{
int yy = y;
while(x < maxn)
{
yy = y;
while(yy < maxn)
{
a[x][yy] += val;
yy += lowbit(yy);
}
x += lowbit(x);
}
}

int Sum(int x, int y)
{
int yy = y, ans = 0;
while(x)
{
yy = y;
while(yy)
{
ans += a[x][yy];
yy -= lowbit(yy);
}
x -= lowbit(x);
}
return ans;
}

void Init()
{
clc(a, 0);
for(int i = 1; i < maxn; i++)
{
for(int j = 1; j < maxn; j++)
{
Add(i, j, 1);
}
}
}

int main()
{
int T, q, x1, y1, x2, y2, n1, sum;
char op;
scanf("%d", &T);
for(int t = 1; t <= T; t++)
{
scanf("%d", &q);
Init();
printf("Case %d:\n", t);
while(q--)
{
scanf(" %c", &op);
if(op == 'S')
{
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
x1++, y1++, x2++, y2++;
int a1, b1, a2, b2;
a1 = min(x1,x2); a2 = max(x1,x2);
b1 = min(y1,y2); b2 = max(y1,y2);
printf("%d\n",Sum(a2,b2) - Sum(a1-1,b2) - Sum(a2,b1-1) + Sum(a1-1,b1-1));
}
else if ( op == 'A' )
{
scanf("%d %d %d", &x1, &y1, &n1);
Add(x1+1, y1+1, n1);
}
else if( op == 'D' )
{
int temp;
scanf("%d %d %d", &x1, &y1, &n1);
x1++, y1++;
temp = Sum(x1,y1) - Sum(x1-1,y1) - Sum(x1,y1-1) + Sum(x1-1,y1-1);
if(temp >= n1)
Add(x1, y1, -n1);
else
Add(x1, y1, -temp);
}
else if(op == 'M')
{
scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &n1);
x1++, y1++, x2++, y2++;
int temp = Sum(x1,y1) - Sum(x1-1,y1) - Sum(x1,y1-1) + Sum(x1-1,y1-1);
if(temp >= n1)
{
Add(x1, y1, -n1);
Add(x2, y2, n1);
}
else
{
Add(x1, y1, -temp);
Add(x2, y2, temp);
}
}
}
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: