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. 解法: 由于是矩阵,且要求区间最大最小和更新单点,很容易想到二维的线段树,可是因为之前没写过二维的 ...
随机推荐
- 【SpringBoot—注解】@requestBody 与@requestparam;@requestBody的加与不加的区别
一)首先说明xia @requestBody与@requestParam的区别 spring的RequestParam注解接收的参数是来自于requestHeader中,即请求头.都是用来获取请求路径 ...
- Js HTML DOM动画
基础页面 为了演示如何通过 JavaScript 来创建 html 动画,我们将使用一张简单的网页: 实例 我的第一部 JavaScript 动画 我的动画在这里. 创建动画容器 所有动画都应该与容器 ...
- 前端面试题归类-HTML2
一. SGML . HTML .XML 和 XHTML 的区别? SGML 是标准通用标记语言,是一种定义电子文档结构和描述其内容的国际标准语言,是所有电子文档标记语言的起源. HTML 是超文本标记 ...
- notapai++ 使用小技巧
alt+鼠标右键 建 实现整体添加字符 例: 25001510153394032 25001510153394034 25001510153393963 25001510153392080 25001 ...
- String--常见面试题
String s = new String("xyz") 创建了几个对象? 实例分析1 javac编译代码,然后用javap来反编译,执行javap -c Test 从结果来看,l ...
- Linux下最常用的10个文件压缩工具
作者简介 李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷.喜欢钻研底层技术,认为底层基础才是王道.一切新技术都离不开操作系统(CPU.内存.磁盘).网络等. ...
- Tomcat7,Tomcat8 的manager 配置
1.打开文件:tomcat目录-->conf-->tomcat-users.xml 2.将以下代码替换原来的所有内容,不要犹豫,就是所有内容. <?xml version=&quo ...
- 【C++】《Effective C++》第八章
第八章 定制new和delete 对于程序开发来说,了解C++内存管理例程的行为是非常重要的.其中两个主角是分配例程和归还例程(operator new和operator delete),配角是new ...
- HBase的架构设计为什么这么厉害!
老刘是一名即将找工作的研二学生,写博客一方面是复习总结大数据开发的知识点,一方面是希望能够帮助和自己一样自学编程的伙伴.由于老刘是自学大数据开发,博客中肯定会存在一些不足,还希望大家能够批评指正,让我 ...
- Linux学习笔记 | 常见错误之VMware启动linux后一直黑屏
方法1: 宿主机(windows)管理员模式运行cmd 输入netsh winsock reset 然后重启电脑 netsh winsock reset命令,作用是重置 Winsock 目录.如果一台 ...