POJ1195 二维线段树
Mobile phones
Write a program, which receives these reports and answers queries about the current total number of active mobile phones in any rectangle-shaped area.
Input
The values will always be in range, so there is no need to check them. In particular, if A is negative, it can be assumed that it will not reduce the square value below zero. The indexing starts at 0, e.g. for a table of size 4 * 4, we have 0 <= X <= 3 and 0 <= Y <= 3.
Table size: 1 * 1 <= S * S <= 1024 * 1024
Cell value V at any time: 0 <= V <= 32767
Update amount: -32768 <= A <= 32767
No of instructions in input: 3 <= U <= 60002
Maximum number of phones in the whole table: M= 2^30
Output
Sample Input
0 4
1 1 2 3
2 0 0 2 2
1 1 1 2
1 1 2 -1
2 1 1 2 3
3
Sample Output
3
4
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
二维线段树,单点修改,区间查询,维护和。
______________________________________________________________________________________________________________________________________________
1 #include<cstdio>
2 #include<iostream>
3 #include<cstring>
4 #include<algorithm>
5 using namespace std;
6
7 const int maxn=1028;
8 struct LIE
9 {
10 int ll,lr,sum;
11 };
12 struct HANG
13 {
14 int hl,hr;
15 LIE lie[maxn<<2];
16 }hang[maxn<<2];
17 int op,n;
18 void readint(int &x)
19 {
20 char c=getchar();
21 int f=1;
22 for(;c<'0' || c>'9';c=getchar())if(c=='-')f=-f;
23 x=0;
24 for(;c<='9'&& c>='0';c=getchar())x=(x<<1)+(x<<3)+c-'0';
25 x*=f;
26 }
27 void buil(int pre,int cur,int ll,int lr)
28 {
29 hang[pre].lie[cur].ll=ll;hang[pre].lie[cur].lr=lr;
30 hang[pre].lie[cur].sum=0;
31 if(ll==lr)return ;
32 int mid=(ll+lr)>>1;
33 buil(pre,cur<<1,ll,mid);
34 buil(pre,cur<<1|1,mid+1,lr);
35 }
36 void build(int cur,int l,int r,int ll,int rr)
37 {
38 hang[cur].hl=l;hang[cur].hr=r;
39 buil(cur,1,ll,rr);
40 if(l==r)return ;
41 int mid=(l+r)>>1;
42 build(cur<<1,l,mid,ll,rr);
43 build(cur<<1|1,mid+1,r,ll,rr);
44 }
45 void upda(int pre,int cur,int hh,int lh,int dat)
46 {
47 hang[pre].lie[cur].sum+=dat;
48 if(hang[pre].lie[cur].ll==hang[pre].lie[cur].lr)return ;
49 int mid=(hang[pre].lie[cur].ll+hang[pre].lie[cur].lr)>>1;
50 if(lh<=mid) upda(pre,cur<<1,hh,lh,dat);
51 else upda(pre,cur<<1|1,hh,lh,dat);
52 }
53 void update(int cur,int x,int y,int dat)
54 {
55 upda(cur,1,x,y,dat);
56 if(hang[cur].hl==hang[cur].hr)return;
57 int mid=(hang[cur].hl+hang[cur].hr)>>1;
58 if(x<=mid)update(cur<<1,x,y,dat);
59 else update(cur<<1|1,x,y,dat);
60 }
61 int qure(int pre,int cur,int yl,int yr)
62 {
63 if(yl<=hang[pre].lie[cur].ll && hang[pre].lie[cur].lr<=yr)return hang[pre].lie[cur].sum;
64 int mid=(hang[pre].lie[cur].ll+hang[pre].lie[cur].lr)>>1;
65 int sum=0;
66 if(yl<=mid)sum+=qure(pre,cur<<1,yl,yr);
67 if(mid<yr)sum+=qure(pre,cur<<1|1,yl,yr);
68 return sum;
69 }
70 int query(int cur,int xl,int yl,int xr,int yr)
71 {
72 if(xl<=hang[cur].hl && hang[cur].hr<=xr)return qure(cur,1,yl,yr);
73 int mid=(hang[cur].hl+hang[cur].hr)>>1;
74 int sum=0;
75 if(xl<=mid)sum+=query(cur<<1,xl,yl,xr,yr);
76 if(mid<xr) sum+=query(cur<<1|1,xl,yl,xr,yr);
77 return sum;
78 }
79 int main()
80 {
81 readint(op);
82 while(op!=3)
83 {
84 if(!op)
85 {
86 readint(n);
87 build(1,0,n-1,0,n-1);
88 }
89 else if(op==1)
90 {
91 int x,y,dat;
92 readint(x);readint(y);readint(dat);
93 update(1,x,y,dat);
94 }
95 else if(op==2)
96 {
97 int xl,xr,yl,yr;
98 readint(xl);readint(yl);readint(xr);readint(yr);
99 printf("%d\n",query(1,xl,yl,xr,yr));
100 }
101 readint(op);
102 }
103 return 0;
104 }
POJ1195 二维线段树的更多相关文章
- POJ1195 Mobile phones 【二维线段树】
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14291 Accepted: 6644 De ...
- UVA 11297 线段树套线段树(二维线段树)
题目大意: 就是在二维的空间内进行单个的修改,或者进行整块矩形区域的最大最小值查询 二维线段树树,要注意的是第一维上不是叶子形成的第二维线段树和叶子形成的第二维线段树要 不同的处理方式,非叶子形成的 ...
- POJ2155 Matrix二维线段树经典题
题目链接 二维树状数组 #include<iostream> #include<math.h> #include<algorithm> #include<st ...
- HDU 1823 Luck and Love(二维线段树)
之前只知道这个东西的大概概念,没具体去写,最近呵呵,今补上. 二维线段树 -- 点更段查 #include <cstdio> #include <cstring> #inclu ...
- poj 2155:Matrix(二维线段树,矩阵取反,好题)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17880 Accepted: 6709 Descripti ...
- poj 1195:Mobile phones(二维线段树,矩阵求和)
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14391 Accepted: 6685 De ...
- POJ 2155 Matrix (二维线段树)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17226 Accepted: 6461 Descripti ...
- HDU 4819 Mosaic (二维线段树)
Mosaic Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total S ...
- HDU 4819 Mosaic --二维线段树(树套树)
题意: 给一个矩阵,每次查询一个子矩阵内的最大最小值,然后更新子矩阵中心点为(Max+Min)/2. 解法: 由于是矩阵,且要求区间最大最小和更新单点,很容易想到二维的线段树,可是因为之前没写过二维的 ...
随机推荐
- 利用MD5进行加密
package com.cn.peitest; import java.io.UnsupportedEncodingException; import java.security.MessageDig ...
- flowable获取上级主管
//主管 Dept managerDept = deptUserUtil.getManagerDept(bean.getCreateDept(),bean.getCreateUser()); //上级 ...
- java Swing组件随着窗口拖动等比移动或等比放大
实现原理很简单, 1清空布局(使用绝对布局) 2添加监听器(监听窗口是否被拖动) 3在监听器里面动态调整 组件的位置 效果如下: 拖动之后效果: 代码实现: import java.awt.Event ...
- MQ关于实现最终一致性分布式事务原理解析
本文讲述阿里云官方文档中关于通过MQ实现分布式事务最终一致性原理 概念介绍 事务消息:消息队列 MQ 提供类似 X/Open XA 的分布式事务功能,通过消息队列 MQ 事务消息能达到分布式事务的最终 ...
- jdbc-创建statement-数量过多导致游标超限
在循环中重复创建 java.sql.Connection.prepareStatement(sql) , 导致游标超限
- 【项目实践】SpringBoot三招组合拳,手把手教你打出优雅的后端接口
以项目驱动学习,以实践检验真知 前言 一个后端接口大致分为四个部分组成:接口地址(url).接口请求方式(get.post等).请求数据(request).响应数据(response).如何构建这几个 ...
- .NET 云原生架构师训练营(模块二 基础巩固 RabbitMQ Masstransit 介绍)--学习笔记
2.6.6 RabbitMQ -- Masstransit 介绍 Masstransit 是什么 Quickstart 消息 Message Masstransit 是什么 Masstransit 是 ...
- Windows下如何玩转火热的go-zero
作者:阿啄debugIT 前言 go-zero 是一个集成了各种工程实践的 web 和 rpc 框架.通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验. go-zero 包含极简的 API ...
- 【剑指 Offer】11.旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的 ...
- 【剑指 Offer】10-II.青蛙跳台阶问题
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008, ...