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& ...
随机推荐
- SoapUI简介和入门实例解析
SoapUI简介 SoapUI是一个开源测试工具,通过soap/http来检查.调用.实现Web Service的功能/负载/符合性测试.该工具既可作为一个单独的测试软件使用,也可利用插件集成到Ecl ...
- vue实例讲解之axios的使用
本篇来讲解一下axios插件的使用,axios是用来做数据交互的插件. 这篇将基于vue实例讲解之vue-router的使用这个项目的源码进行拓展. axios的使用步骤: 1.安装axios npm ...
- 使用SoapUI工具做get请求和post请求接口测试
祝大家节日快乐啦. 之前写过的一篇帖子已经介绍了SoapUI工具的基本使用,所以在此不再重复讲解关于建工程.建测试套件.添加用例等操作,可查看该篇文章详解:http://www.cnblogs.com ...
- JS数字金额转换为货币汉字形式
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- hdu4578 线段树 三次方,二次方,一次方的值
Yuanfang is puzzled with the question below: There are n integers, a 1, a 2, -, a n. The initial val ...
- Python数据分析(二): Numpy技巧 (2/4)
numpy.pandas.matplotlib(+seaborn)是python数据分析/机器学习的基本工具. numpy的内容特别丰富,我这里只能介绍一下比较常见的方法和属性. 昨天晚上发了第一 ...
- java基础知识及详细笔记
第一章:初识java 1.1.java的概述 ü 什么是计算机程序:计算机按照某种顺序而完成的一系列有序指令的集合. ü Java的作用:1:安装和运行本机上的桌面程序.2:通过浏览器访问面向in ...
- spring 内部工作机制(二)
本章节讲Spring容器从加载配置文件到创建出一个完整Bean的作业流程及参与的角色. Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表, ...
- php里的抽象类和接口
//实例化类产生对象.//class fenbi//{// //普通成员,属于对象// public $length = "10cm";// //静态成员,静态变量,属于类.// ...
- PS 软件操作应用处理——粒子化任务效果
前 言 JRedu 上次分享中,给大家介绍了一些图片的处理方法,主要是通过滤镜里的功能,把图片处理成素描效果或者水彩画效果,营造出不同的氛围. PS是一款非常强大的软件,包含了非常多的功能,合成 ...