Mobile phones

POJ - 1195

Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows. The area is divided into squares. The squares form an S * S matrix with the rows and columns numbered from 0 to S-1. Each square contains a base station. The number of active mobile phones inside a square can change because a phone is moved from a square to another or a phone is switched on or off. At times, each base station reports the change in the number of active phones to the main base station along with the row and the column of the matrix. 

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 input is read from standard input as integers and the answers to the queries are written to standard output as integers. The input is encoded as follows. Each input comes on a separate line, and consists of one instruction integer and a number of parameter integers according to the following table. 

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

Your program should not answer anything to lines with an instruction other than 2. If the instruction is 2, then your program is expected to answer the query by writing the answer as a single line containing a single integer to standard 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 二维线段树的更多相关文章

  1. POJ1195 Mobile phones 【二维线段树】

    Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14291   Accepted: 6644 De ...

  2. UVA 11297 线段树套线段树(二维线段树)

    题目大意: 就是在二维的空间内进行单个的修改,或者进行整块矩形区域的最大最小值查询 二维线段树树,要注意的是第一维上不是叶子形成的第二维线段树和叶子形成的第二维线段树要  不同的处理方式,非叶子形成的 ...

  3. POJ2155 Matrix二维线段树经典题

    题目链接 二维树状数组 #include<iostream> #include<math.h> #include<algorithm> #include<st ...

  4. HDU 1823 Luck and Love(二维线段树)

    之前只知道这个东西的大概概念,没具体去写,最近呵呵,今补上. 二维线段树 -- 点更段查 #include <cstdio> #include <cstring> #inclu ...

  5. poj 2155:Matrix(二维线段树,矩阵取反,好题)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17880   Accepted: 6709 Descripti ...

  6. poj 1195:Mobile phones(二维线段树,矩阵求和)

    Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14391   Accepted: 6685 De ...

  7. POJ 2155 Matrix (二维线段树)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17226   Accepted: 6461 Descripti ...

  8. HDU 4819 Mosaic (二维线段树)

    Mosaic Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Total S ...

  9. HDU 4819 Mosaic --二维线段树(树套树)

    题意: 给一个矩阵,每次查询一个子矩阵内的最大最小值,然后更新子矩阵中心点为(Max+Min)/2. 解法: 由于是矩阵,且要求区间最大最小和更新单点,很容易想到二维的线段树,可是因为之前没写过二维的 ...

随机推荐

  1. Redis基础篇(五)AOF与RDB比较和选择策略

    RDB和AOF对比 关于RDB和AOF的优缺点,官网上面也给了比较详细的说明redis.io/topics/pers- RDB 优点: RDB快照是一个压缩过的非常紧凑的文件,保存着某个时间点的数据集 ...

  2. 架构设计哲学【三种方式:支持DevOps的原则】

    三种方式:支持DevOps的原则 2012年8月22日作者Gene Kim 45条评论 这篇文章是杨波老师分享的一篇文章:这几年对他架构影响最深的一篇文章.主要描述是关于DevOps的,但对系统架构同 ...

  3. Java Object to Class

    User user = new User(username,password); //添加构成JWT的参数 JwtBuilder builder = Jwts.builder().setHeaderP ...

  4. mysql数据库限制多次登录失败,限定用户重试时间

    前言 最近的项目开始进行安全测试,其中有一个安全问题是这样的. 应该增加用户登录失败处理功能,限制非法登录次数. 建议是增加mysql数据库的登陆失败的锁定功能. 相信大家也都会遇到这样的问题,在这里 ...

  5. Java并发包源码学习系列:CLH同步队列及同步资源获取与释放

    目录 本篇学习目标 CLH队列的结构 资源获取 入队Node addWaiter(Node mode) 不断尝试Node enq(final Node node) boolean acquireQue ...

  6. 浅谈ES6数组及对象的解构

    一.数组的解构,ES6的新特性,主要是方便操作数组,节省不必要的代码,提高代码质量. 上图例子中, example1: 之前想要获取数组中的值,只能挨个获取下标,然后取值 example2:ES6新特 ...

  7. Ubuntu无法ssh远程连接问题 (转)

    [系统]Ubuntu 12.04 server [问题描述]新安装的Ubuntu系统无法直接通过ssh远程连接. [解决办法] 新安装的Ubuntu系统并未安装ssh-server服务,需要自行安装, ...

  8. 使用lua+redis解决发多张券的并发问题

    前言 公司有一个发券的接口有并发安全问题,下面列出这个问题和解决这个问题的方式. 业务描述 这个接口的作用是给会员发多张券码.涉及到4张主体,分别是:用户,券,券码,用户领取记录. 下面是改造前的伪代 ...

  9. NTP服务解析

    ······[NTP服务概述] NTP(Network Time Protocol)服务主要用于同步服务器时间. nptd 可以运行在多种模式下,包括对称的 主动.被动(active/passive) ...

  10. Go语言从入门到放弃(四)

    前言 有段时间没摸Go语言了,最近B站的Go语言泄露挺火的. 还差的很远呐 学无止境 本章主要介绍一些零碎的小知识点 变更记录 # 19.4.30  起笔 # 19.4.30  增加代码打包步骤 正文 ...