See you~

Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 4753    Accepted Submission(s): 1518

Problem Description
Now I am leaving hust acm. In the past two and half years, I learned so many knowledge about Algorithm and Programming, and I met so many good friends. I want to say sorry to Mr, Yin, I must leave now ~~>.<~~. I am very sorry, we could not advanced to the World Finals last year.
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
In the first line of the input file there is an Integer T(1<=T<=10), which means the number of test cases in the input file. Then N test cases are followed.
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
At the beginning of each case, output "Case X:" where X is the index of the test case, then followed by the "S" queries.
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
 
Author
Sempr|CrazyBird|hust07p43
 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  1541 2492 1894 1394 3450 
/*
给定4种操作: 
S x1 y1 x2 y2 询问以(x1 , y1) - (x2 , y2)为对角线的矩形的面积,但是这个对角线不一定是正对角线。
A x1 y1 n 把点(x1 , y1)加上n。
D x1 y1 n点(x1 , y1)减去n如果不足n就全部删除即可。
M x1 y1 x2 y2 n 把点(x1 , y1)点值中扣除n加到(x2 , y2),如果不过n则把(x1 , y1)值全部加到(x2 , y2)
*/
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<string.h>
#define lowbit(x) x&(-x)
#define N 1005
using namespace std;
int t,n;
int c[N][N];
void update(int x,int y,int val)
{
//int flag=fabs(val);
// while(x<N)
// {
// while(y<N)
// {
// cout<<x<<" "<<y<<endl;
// c[x][y]+=val;
// if(c[x][y]<0)
// {
// flag=c[x][y]+val;
// c[x][y]=0;
// }
// y+=lowbit(y);
// }
// x+=lowbit(x);
// }
for(int i=x;i<N;i+=lowbit(i))
{
for(int j=y;j<N;j+=lowbit(j))
{
c[i][j]+=val;
// if(c[i][j]<0)
// {
// flag=c[i][j]+val;
// c[i][j]=0;
// }
}
}
// return val;//返回你实际搬运的东西
}
int getsum(int x,int y)
{
int s=;
// while(x>0)
// {
// while(y>0)
// {
// s+=c[x][y];
// y-=lowbit(y);
// }
// x-=lowbit(x);
// }
for(int i=x;i>;i-=lowbit(i))
{
for(int j=y;j>;j-=lowbit(j))
{
s+=c[i][j];
}
}
return s;
}
// int getS(int x1,int y1,int x2,int y2)
// {
// cout<<getsum(x1,y1)<<" "<<getsum(x1-1,y2)<<" "<<getsum(x2,y1-1)<<" "<<getsum(x2-1,y2-1)<<endl;
// return getsum(x1,y1)-getsum(x1,y2-1)-getsum(x2-1,y1)+getsum(x2-1,y2-1);
// }
int main()
{
//freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin);
scanf("%d",&t);
int Case=;
while(t--)
{
printf("Case %d:\n",Case++);
scanf("%d",&n);
int x1,x2,y1,y2,val;
memset(c,,sizeof c);
for(int i=;i<=N;i++)
for(int j=;j<=N;j++)
update(i,j,);
//cout<<getsum(1,1)<<" "<<getsum(2,2)<<endl;
for(int i=;i<n;i++)
{
//getchar();
char op[];
scanf("%s",&op);
//getchar();
if(op[]=='A'||op[]=='D')
{
scanf("%d%d%d",&x1,&y1,&val);
x1++;y1++;
if(op[]=='D')
val=-min(val,getsum(x1,y1)-getsum(x1-,y1)-getsum(x1,y1-)+getsum(x1-,y1-));
update(x1,y1,val);
}
else if(op[]=='M')
{
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&val);
x1++;x2++;y1++;y2++;
int temp=min(val,getsum(x1,y1)-getsum(x1-,y1)-getsum(x1,y1-)+getsum(x1-,y1-));//这个是你实际从前一个点搬走的东西
update(x1,y1,-temp);
update(x2,y2,temp);
}
else
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1<x2)
swap(x1,x2);
if(y1<y2)
swap(y1,y2);//并不一定是正对角线
x1++;x2++;y1++;y2++;
//cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<endl;
//cout<<"getsum(x2,y2)="<<getsum(x2,y2)<<endl;
// cout<<getsum(x1,y1)<<" "<<getsum(x1,y2-1)<<" "<<getsum(x2-1,y1)<<" "<<getsum(x2-1,y2-1)<<endl;
printf("%d\n",getsum(x1,y1)-getsum(x1,y2-)-getsum(x2-,y1)+getsum(x2-,y2-));
}
}
}
return ;
}
/*
Case 1:
1
3
Case 2:
1
4
*/

HDU 1892 See you~(二维树状数组)的更多相关文章

  1. HDU 1892(书架统计 二维树状数组)

    题意是在二维平面上在一些位置上进行数据的增删改查操作,使用树状数组(了解树状数组点这里) 原来的树状数组在求区间和时是 sum( x, y ) = getsum( y ) - getsum( x - ...

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

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1892 See you~ Problem Description Now I am leaving h ...

  3. 【 HDU - 4456 】Crowd (二维树状数组、cdq分治)

    BUPT2017 wintertraining(15) #5A HDU 4456 题意 给你一个n行n列的格子,一开始每个格子值都是0.有M个操作,p=1为第一种操作,给格子(x,y)增加z.p=2为 ...

  4. hdu 2642 Stars 【二维树状数组】

    题目 题目大意:Yifenfei是一个浪漫的人,他喜欢数天上的星星.为了使问题变得更容易,我们假设天空是一个二维平面,上面的星星有时会亮,有时会发暗.最开始,没有明亮的星星在天空中,然后将给出一些信息 ...

  5. hdu 5517 Triple(二维树状数组)

    Triple Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  6. HDU 5517---Triple(二维树状数组)

    题目链接 Problem Description Given the finite multi-set A of n pairs of integers, an another finite mult ...

  7. HDU 5517 【二维树状数组///三维偏序问题】

    题目链接:[http://acm.split.hdu.edu.cn/showproblem.php?pid=5517] 题意:定义multi_set A<a , d>,B<c , d ...

  8. HDU 5465 Clarke and puzzle Nim游戏+二维树状数组

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5465 Clarke and puzzle  Accepts: 42  Submissions: 26 ...

  9. hdu 2642 二维树状数组 单点更新区间查询 模板水题

    Stars Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/65536 K (Java/Others) Total Subm ...

  10. hdu 2642二维树状数组 单点更新区间查询 模板题

    二维树状数组 单点更新区间查询 模板 从零开始借鉴http://www.2cto.com/kf/201307/227488.html #include<stdio.h> #include& ...

随机推荐

  1. Glide 这样用,更省内存!!!

    一.前言 Glide 是 Google 官方推荐的一款图片加载库,使用起来也非常的简单便利,Glide 它帮我们完成了很多很重要,但是却通用的功能,例如:图片的加载压缩.展示.加载图片的内存管理等等. ...

  2. 每周分享之 二 http协议(1)

    本次分享http协议,共分为三部分,这是第一部分,主要讲解http的发展历程,各个版本,以及各个版本的特点. 一:http/0.9 最早版本是1991年发布的0.9版.该版本极其简单,只有一个命令GE ...

  3. Finding LCM (最小公倍数)

    Finding LCM Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu [Submit]   ...

  4. [Tjoi2013]循环格

    [Tjoi2013]循环格 2014年3月18日1,7500 Description Input 第一行两个整数R,C.表示行和列,接下来R行,每行C个字符LRUD,表示左右上下. Output 一个 ...

  5. Dubbo分布式服务子系统的划分

    一.划分子系统的策略 按照系统的业务模块的独立性划分 二.划分时服务子系统的数量的控制 过多:可能划分过细,破坏业务子系统的独立性,部署维护工作量大,独立进程占用内存多 过少:没能很好的解耦,开发维护 ...

  6. 配置和启动Kubernetes服务

    安装etcd服务 下载安装包 wget https://github.com/coreos/etcd/releases/download/v3.1.3/etcd-v3.1.3-linux-amd64. ...

  7. Ubuntu16.04 install jdk-8u144-linux-x64.tar.gz

    打开终端: Ctrl+Alt+T 下载jdk: wget http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b ...

  8. 设置Intel网卡以抓取报文的vlan tag

    一.实验环境 1.ThinkPad T450 Notebook 2.Notebook网卡Intel I218-V 二.设置步骤 1."设备管理器" -> "Inte ...

  9. 纯CSS3实现轮播图

    前言 纯css3实现的轮播图效果,和JavaScript控制的相比,简单高效了很多,但是功能也更加单一,只有轮播不能手动切换. 用什么实现的呢?页面布局 + animation动画 HTML部分 &l ...

  10. sqlserver游标使用和循环

    /*** 游标的使用 讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱. 使用游标的顺序: 声名游标.打开游标.读取数据.关闭游标.删除游标. 1.3.1声明游标 最简单游标声明:DECLA ...