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. 解法: 由于是矩阵,且要求区间最大最小和更新单点,很容易想到二维的线段树,可是因为之前没写过二维的 ...
随机推荐
- MySQL中的模糊查询 like 和 Oracle中的 instr() 函数有同样的查询效果
注:MySQL中的模糊查询 like 和 Oracle中的 instr() 函数有同样的查询效果: 如下所示: MySQL: select * from tableName where name li ...
- Java 为每个原始类型提供了哪些包装类型:
java的包装类型: 原始类型: boolean,char,byte,short,int,long,float,double 包装类型:Boolean,Character,Byte,Short,Int ...
- 各开源协议BSD、Apache Licence 2.0、GPL
以下是上述协议的简单介绍:BSD开源协议BSD开源协议是一个给于使用者很大自由的协议.基本上使用者可以"为所欲为",可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有 ...
- 大数据量查询容易OOM?试试MySQL流式查询
一.前言 程序访问 MySQL 数据库时,当查询出来的数据量特别大时,数据库驱动把加载到的数据全部加载到内存里,就有可能会导致内存溢出(OOM). 其实在 MySQL 数据库中提供了流式查询,允许把符 ...
- mysql 创建[序列],功能类似于oracle的序列
参考自菜鸟教程 https://www.runoob.com/mysql/mysql-using-sequences.html 使用函数创建自增序列管理表(批量使用自增表,设置初始值,自增幅度) 第一 ...
- window10 安装Mysql 8.0.17以及忘记密码重置密码
一.安装Mysql8.0.17 1:首先去官网下载安装包 下载地址:https://dev.mysql.com/downloads/mysql/ 2:将解压文件解压到你安装的目录:D:\mysql\m ...
- Linux下Oracle19c离线rpm安装
一.基础环境配置 1.关闭系统防火墙 systemctl stop firewalld syustemctl disable firewalld 2.关闭selinux vim /etc/selinu ...
- 万万没想到,JVM内存区域的面试题也可以问的这么难?
二.Java内存区域 1.Java内存结构 内存结构 程序计数器 当前线程所执行字节码的行号指示器.若当前方法是native的,那么程序计数器的值就是undefined. 线程私有,Java内存区域中 ...
- Java 安全之Weblogic 2017-3248分析
Java 安全之Weblogic 2017-3248分析 0x00 前言 在开头先来谈谈前面的绕过方式,前面的绕过方式分别使用了streamMessageImpl 和MarshalledObject对 ...
- 常用 .gitignore 模板
前言 每次建项目的时候可以直接复制了,也算是方便自己,以后发现少的会更新 正文 作用 git提交时忽略文件 文件名 .gitignore Python # Byte-compiled / optimi ...