HDU 1892 See you~(二维树状数组)
See you~
Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 4753 Accepted Submission(s): 1518
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.
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.
For each "S" query, just print out the total number of books in that area.
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
1
3
Case 2:
1
4
/*
给定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~(二维树状数组)的更多相关文章
- HDU 1892(书架统计 二维树状数组)
题意是在二维平面上在一些位置上进行数据的增删改查操作,使用树状数组(了解树状数组点这里) 原来的树状数组在求区间和时是 sum( x, y ) = getsum( y ) - getsum( x - ...
- HDU 1892 See you~ (二维树状数组)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1892 See you~ Problem Description Now I am leaving h ...
- 【 HDU - 4456 】Crowd (二维树状数组、cdq分治)
BUPT2017 wintertraining(15) #5A HDU 4456 题意 给你一个n行n列的格子,一开始每个格子值都是0.有M个操作,p=1为第一种操作,给格子(x,y)增加z.p=2为 ...
- hdu 2642 Stars 【二维树状数组】
题目 题目大意:Yifenfei是一个浪漫的人,他喜欢数天上的星星.为了使问题变得更容易,我们假设天空是一个二维平面,上面的星星有时会亮,有时会发暗.最开始,没有明亮的星星在天空中,然后将给出一些信息 ...
- hdu 5517 Triple(二维树状数组)
Triple Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- HDU 5517---Triple(二维树状数组)
题目链接 Problem Description Given the finite multi-set A of n pairs of integers, an another finite mult ...
- HDU 5517 【二维树状数组///三维偏序问题】
题目链接:[http://acm.split.hdu.edu.cn/showproblem.php?pid=5517] 题意:定义multi_set A<a , d>,B<c , d ...
- HDU 5465 Clarke and puzzle Nim游戏+二维树状数组
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5465 Clarke and puzzle Accepts: 42 Submissions: 26 ...
- hdu 2642 二维树状数组 单点更新区间查询 模板水题
Stars Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/65536 K (Java/Others) Total Subm ...
- hdu 2642二维树状数组 单点更新区间查询 模板题
二维树状数组 单点更新区间查询 模板 从零开始借鉴http://www.2cto.com/kf/201307/227488.html #include<stdio.h> #include& ...
随机推荐
- css预处理语言--让你的css编写更加简单方便
CSS预处理语言之一-------LESS Less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展. Less 可以运行在 Nod ...
- 翻译:MariaDB ALTER TABLE语句
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- CentOS7安装后配置MariaDB
安装后,优先推荐先对安全设置进行配置,键入命令 sudo mysql_secure_installation 键入当前密码,当前没有,直接回车,之后跟随提示会问几个问题:设置 root 密码? / 移 ...
- 微服务~Eureka实现的服务注册与发现及服务之间的调用
微服务里一个重要的概念就是服务注册与发现技术,当你有一个新的服务运行后,我们的服务中心可以感知你,然后把加添加到服务列表里,然后当你死掉后,会从服务中心把你移除,而你作为一个服务,对其它服务公开的只是 ...
- 修改NSMutableArray中的元素时的注意事项
最近做项目遇到从文件加载数组,并对数组中的元素进行操作的问题,特意写了个Demo,记录下要注意的东西: 代码如下: NSArray *array = @["]; NSMutableArray ...
- uva 10391
这个题,单纯做出来有很多种方法,但是时间限制3000ms,因此被TL了不知道多少次,关键还是找对最优解决方法,代码附上: #include<bits/stdc++.h> using nam ...
- AES加密解密——AES在JavaWeb项目中前台JS加密,后台Java解密的使用
一:前言 在软件开发中,经常要对数据进行传输,数据在传输的过程中可能被拦截,被监听,所以在传输数据的时候使用数据的原始内容进行传输的话,安全隐患是非常大的.因此就要对需要传输的数据进行在客户端进行加密 ...
- stdafx.h 的作用
stdafx.h VC工程里面经常见到stdafx.h这个头文件,以前也没有特别注意,但是这个文件用不好经常会出错. stdafx的英文全称为:Standard Application Framewo ...
- CentOSv6.8 修改防火墙配置、修改SSH端口
查看防火墙目前使用状况: service iptables status 修改防火墙配置: vi /etc/sysconfig/iptables 重启防火墙,让刚才修改的配置生效: service i ...
- POJ1083 Moving Tables(模拟)
The famous ACM (Advanced Computer Maker) Company has rented a floor of a building whose shape is in ...