hdoj 1892(二维树状数组)
Problem H
Time Limit : 5000/3000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 8 Accepted Submission(s) : 3
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
When coming into our training room, a lot of books are in my eyes. And every time the books are moving from one place to another one. Now give you the position of the books at the early of the day. And the moving information of the books the day, your work is to tell me how many books are stayed in some rectangles.
To make the problem easier, we divide the room into different grids and a book can only stayed in one grid. The length and the width of the room are less than 1000. I can move one book from one position to another position, take away one book from a position or bring in one book and put it on one position.
Input
For each test case, in the first line there is an Integer Q(1<Q<=100,000), means the queries of the case. Then followed by Q queries.
There are 4 kind of queries, sum, add, delete and move.
For example:
S x1 y1 x2 y2 means you should tell me the total books of the rectangle used (x1,y1)-(x2,y2) as the diagonal, including the two points.
A x1 y1 n1 means I put n1 books on the position (x1,y1)
D x1 y1 n1 means I move away n1 books on the position (x1,y1), if less than n1 books at that position, move away all of them.
M x1 y1 x2 y2 n1 means you move n1 books from (x1,y1) to (x2,y2), if less than n1 books at that position, move away all of them.
Make sure that at first, there is one book on every grid and 0<=x1,y1,x2,y2<=1000,1<=n1<=100.
Output
For each "S" query, just print out the total number of books in that area.
Sample Input
2 3 S 1 1 1 1 A 1 1 2 S 1 1 1 1 3 S 1 1 1 1 A 1 1 2 S 1 1 1 2
Sample Output
Case 1: 1 3 Case 2: 1 4
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int n=1010;
int c[n+1][n+1];
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int y,int val)
{
for(int i=x;i<=n;i+=lowbit(i))
{
for(int j=y;j<=n;j+=lowbit(j))
{
c[i][j]+=val;
}
}
}
int getsum(int x,int y)
{
int cnt=0;
for(int i=x;i>=1;i-=lowbit(i))
{
for(int j=y;j>=1;j-=lowbit(j))
{
cnt+=c[i][j];
}
}
return cnt;
}
int val[n+1][n+1];
int main()
{
int ci;scanf("%d",&ci);
int pl=1;
while(ci--)
{
memset(c,0,sizeof(c));
printf("Case %d:\n",pl++);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
update(i,j,1);
val[i][j]=1;
}
}
int sa;scanf("%d",&sa);
while(sa--)
{
char ch;cin>>ch;
if(ch=='S')
{
int xx1,yy1,xx2,yy2;
scanf("%d%d%d%d",&xx1,&yy1,&xx2,&yy2);
xx1++,xx2++,yy1++,yy2++;//从1开始
int x1,x2,y1,y2;
x1=min(xx1,xx2);x2=max(xx1,xx2);
y1=min(yy1,yy2);y2=max(yy1,yy2);
int cnt=getsum(x2,y2)-getsum(x1-1,y2)-getsum(x2,y1-1)+getsum(x1-1,y1-1);
printf("%d\n",cnt);
}
else if(ch=='A')
{
int x,y,l;
scanf("%d%d%d",&x,&y,&l);
x++,y++;
update(x,y,l);
val[x][y]+=l;
}
else if(ch=='D')
{
int x,y,l;
scanf("%d%d%d",&x,&y,&l);
x++,y++;
if(l>val[x][y]) l=val[x][y];//important
update(x,y,-l);
val[x][y]+=-l;
}
else
{
int x1,x2,y1,y2,l;
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&l);
x1++,x2++,y1++,y2++;
if(l>val[x1][y1]) l=val[x1][y1];//important
update(x1,y1,-l);
val[x1][y1]+=-l;
update(x2,y2,l);
val[x2][y2]+=l;
}
}
}
return 0;
}
hdoj 1892(二维树状数组)的更多相关文章
- 二维树状数组 BZOJ 1452 [JSOI2009]Count
题目链接 裸二维树状数组 #include <bits/stdc++.h> const int N = 305; struct BIT_2D { int c[105][N][N], n, ...
- HDU1559 最大子矩阵 (二维树状数组)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1559 最大子矩阵 Time Limit: 30000/10000 MS (Java/Others) ...
- POJMatrix(二维树状数组)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 22058 Accepted: 8219 Descripti ...
- poj 1195:Mobile phones(二维树状数组,矩阵求和)
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14489 Accepted: 6735 De ...
- Codeforces Round #198 (Div. 1) D. Iahub and Xors 二维树状数组*
D. Iahub and Xors Iahub does not like background stories, so he'll tell you exactly what this prob ...
- POJ 2155 Matrix(二维树状数组+区间更新单点求和)
题意:给你一个n*n的全0矩阵,每次有两个操作: C x1 y1 x2 y2:将(x1,y1)到(x2,y2)的矩阵全部值求反 Q x y:求出(x,y)位置的值 树状数组标准是求单点更新区间求和,但 ...
- [poj2155]Matrix(二维树状数组)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 25004 Accepted: 9261 Descripti ...
- POJ 2155 Matrix (二维树状数组)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17224 Accepted: 6460 Descripti ...
- [POJ2155]Matrix(二维树状数组)
题目:http://poj.org/problem?id=2155 中文题意: 给你一个初始全部为0的n*n矩阵,有如下操作 1.C x1 y1 x2 y2 把矩形(x1,y1,x2,y2)上的数全部 ...
随机推荐
- 【Better Code】面向切面编程
用AOP改善JavaScript代码http://www.w3cfuns.com/thread-5597323-1-1.html
- [转]让程序在崩溃时体面的退出之SEH+Dump文件
原文地址:http://blog.csdn.net/starlee/article/details/6649605 在我上篇文章<让程序在崩溃时体面的退出之SEH>中讲解了SEH中try/ ...
- hdoj 3746 Cyclic Nacklace【KMP求在结尾加上多少个字符可以使字符串至少有两次循环】
Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- ADB server didn't ACK的问题
今天出现eclipse用手机调试时,一直起不来,出现ADB server didn't ACK,提示restart adb或者重启eclipse,按照原来的,查看了任务管理器中,没发现已经启动的adb ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(45)-工作流设计-设计步骤
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(45)-工作流设计-设计步骤 系列目录 步骤设计很重要,特别是规则的选择. 我这里分为几个规则 1.按自行 ...
- DllImport中的EntryPoint
工作中常常会使用到C#的应用来调用C++中的底层函数,此时就须要使用到DllImport,而DllImport中有一个EntryPoint(入口点),非常多文章都没有说明这个值怎样进行获取的,详细获取 ...
- [PWA] Caching with Progressive libraries
Mainly introduce two libaraies: sw-precache and sw-toolbox. Install: npm install --save-dev sw-preca ...
- Eclipse启动 报错[Failed to load the JNI shared library jvm.dll
准备要做java服务器,在安装开发环境时,启动Eclipse报错[Failed to load the JNI shared library jvm.dll] 研究了下,造成错误的原因是由于eclip ...
- Android中GridView拖拽的效果
最 近看到联想,摩托罗拉等,手机launcher中有个效果,进入mainmenu后,里面的应用程序的图标可以拖来拖去,所以我也参照网上给的代码,写了 一个例子.还是很有趣的,实现的流畅度没有人家的那么 ...
- 多目标遗传算法 ------ NSGA-II (部分源码解析) 二进制编码的个体解码操作 decode.c
种群解码函数 decode_pop 为包装函数, 核心调用函数为 decode_ind , 对每个个体进行解码. /* Routines to decode the population */ ...