hihoCoder#1077 RMQ问题再临-线段树
终于做到线段树的题了,因为建树、更新、查询都是递归操作,所以其实挺好写的。
用数组存的树,记得MAX_NODE开成两倍叶节点数大小,否则RE啊。。不要问我是怎么知道的。
代码:
#include <iostream>
#include <climits>
using namespace std; #define MAX_NODE 2000008 int N, Q; struct SegmentTree {
int left[MAX_NODE];
int right[MAX_NODE];
int begin[MAX_NODE];
int end[MAX_NODE];
int value[MAX_NODE];
int root;
int size; void init() {
size = ;
left[] = right[] = root = ;
value[] = INT_MAX;
} int insert(int v) {
value[size] = v;
size++;
return size - ;
} int _build(int l, int r) {
if (l > r)
return ;
if (l == r) {
left[l] = right[l] = ;
begin[l] = end[l] = l;
return l;
} int lc = _build(l, (l + r) / );
int rc = _build((l + r) / + , r);
int me = insert(-);
left[me] = lc;
right[me] = rc;
begin[me] = l;
end[me] = r;
value[me] = min(value[lc], value[rc]); return me;
} void build() {
root = _build(, size - );
} int _query(int n, int l, int r) {
if (begin[n] == l && end[n] == r)
return value[n];
int medium = (begin[n] + end[n]) / ;
if (r <= medium)
return _query(left[n], l, r);
if (l > medium)
return _query(right[n], l, r);
return min(_query(left[n], l, medium), _query(right[n], medium + , r));
} int query(int l, int r) {
return _query(root, l, r);
} void _update(int n, int p, int v) {
if (begin[n] == p && end[n] == p) {
value[p] = v;
return;
}
int medium = (begin[n] + end[n]) / ;
if (p <= medium)
_update(left[n], p, v);
if (p > medium)
_update(right[n], p, v);
value[n] = min(value[left[n]], value[right[n]]);
} void update(int p, int v) {
_update(root, p, v);
}
} st; int main() {
st.init(); scanf("%d", &N);
for (int i = ; i < N; i++) {
int v;
scanf("%d", &v);
st.insert(v);
} st.build(); scanf("%d", &Q);
while (Q--) {
int t, a, b;
scanf("%d%d%d", &t, &a, &b);
if (t)
st.update(a, b);
else
printf("%d\n", st.query(a, b));
} return ;
}
hihoCoder#1077 RMQ问题再临-线段树的更多相关文章
- Hihocoder #1077 : RMQ问题再临-线段树(线段树:结构体建树+更新叶子往上+查询+巧妙使用father[]+线段树数组要开大4倍 *【模板】)
#1077 : RMQ问题再临-线段树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到:小Hi给小Ho出了这样一道问题:假设整个货架上从左到右摆放了N种商品,并 ...
- hihocode 1077 : RMQ问题再临-线段树
#1077 : RMQ问题再临-线段树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到:小Hi给小Ho出了这样一道问题:假设整个货架上从左到右摆放了N种商品,并 ...
- hihoCode r#1077 : RMQ问题再临-线段树
思路: 两种实现方法: (1)用链表(2)用数组. #include <bits/stdc++.h> using namespace std; int n, q, L, R, op, P, ...
- hihoCoder week19 RMQ问题再临-线段树 单点更新 区间查询
单点更新 区间查询 #include <bits/stdc++.h> using namespace std; #define m ((l+r)/2) #define ls (rt< ...
- [bzoj3339]Rmq Problem||[bzoj3585]mex_线段树
Rmq Problem bzoj-3339||mex bzoj-3585 题目大意:给定一个长度为n的数列a,多次讯问区间l,r中最小的不属于集合{$A_l,A_{l+1}...A_r$}的非负整数. ...
- CF803G-Periodic RMQ Problem【离散化,线段树,ST表】
正题 题目链接:https://www.luogu.com.cn/problem/CF803G 题目大意 一个长度为\(n\)的序列\(a\)复制\(k\)份连接,要求支持 区间赋值 区间查询最小值 ...
- hihoCoder #1070 : RMQ问题再临
G++ 77ms 0MB 思路:这题用暴力是最快的,甚至比线段树还佳. 按全部都是查询的来算,是O(n*q). #include <bits/stdc++.h> using namespa ...
- NYOJ 1012 RMQ with Shifts (线段树)
题目链接 In the traditional RMQ (Range Minimum Query) problem, we have a static array A. Then for each q ...
- nyoj 568——RMQ with Shifts——————【线段树单点更新、区间求最值】
RMQ with Shifts 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 In the traditional RMQ (Range Minimum Q ...
随机推荐
- *关于TCP长连接,NAT超时,心跳包
参考: http://www.jianshu.com/p/584707554ed7 1.TCP长连接 TCP连接建立后只要不明确关闭,逻辑上连接一直存在. TCP是有保活定时器的,可以打开保活定时器来 ...
- github下载下来的C#控制台小游戏[含源码]
早就听说了github是世界最大的源码库,但自己却不是很懂,今天去研究了下,注册了一个帐号,然后在上面搜索了一下C# game,然后发现有许多的游戏. 随意地选择了一个,感觉比较简单,于是就下载了下来 ...
- sdut2784&cf 126b Good Luck!(next数组)
链接 next数组的巧妙应用 学弟出给学弟的学弟的题.. 求最长的 是前缀也是后缀同时也是中缀的串 next的数组求的就是最长的前后缀 但是却不能求得中缀 所以这里 就把尾部去掉之后再求 这样就可 ...
- [书目20141009]《ReWork》
ReWork1: ============= 引言篇INTRODUCTION开局篇FIRST 新的现实缷负篇TAKEDOWNS 忘了“现实世界” 哪来的从错误中学习 计划即瞎猜 何必壮大? 工作狂 受 ...
- http的请求与响应-----content-type
content-type 指请求消息头的中请求消息数据的格式 有三种用法 第一种:设置在request header的参数中 js中可以在发送请求前在请求消息头中设置content-typevar x ...
- QPushButton注册事件过滤器后按钮消失
版权声明:本文为博主原创文章,转载需要注明出处. RT,代码如下: ui.btn_set->installEventFilter(this); bool MousrHoverTest::even ...
- Windows 如何使用telnet管理虚拟机Linux
Linux远程登录的工具很多,如putty,SecureCRT…… 其实借助Windows的telnet工具就可以在命令提示符轻松的登录到Linux系统进行操作了. 虽然telnet很简单,但还是要进 ...
- webpac入门
基于node环境,必须确保node已经安装:node-v,npm-v 基础入门 前身:browserify 缺点:只能转化JS webpack作用:一切都是模块化(js.css图片等),一个模块加载器 ...
- charset - 设置 G0/G1 字符集槽中的一个的 ACM
总览 (SYNOPSIS) charset [-v] G0|G1 [cp437|iso01|vt100|user|<acm_name>] 描述 (DESCRIPTION) linux 终端 ...
- gearman的安装
#gearman服务的安装与使用 #-- set -x set -e #安装开发依赖库 yum install gcc gcc-c++ make automake glibc libgomp libs ...