原题地址

终于做到线段树的题了,因为建树、更新、查询都是递归操作,所以其实挺好写的。

用数组存的树,记得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问题再临-线段树的更多相关文章

  1. Hihocoder #1077 : RMQ问题再临-线段树(线段树:结构体建树+更新叶子往上+查询+巧妙使用father[]+线段树数组要开大4倍 *【模板】)

    #1077 : RMQ问题再临-线段树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到:小Hi给小Ho出了这样一道问题:假设整个货架上从左到右摆放了N种商品,并 ...

  2. hihocode 1077 : RMQ问题再临-线段树

    #1077 : RMQ问题再临-线段树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到:小Hi给小Ho出了这样一道问题:假设整个货架上从左到右摆放了N种商品,并 ...

  3. hihoCode r#1077 : RMQ问题再临-线段树

    思路: 两种实现方法: (1)用链表(2)用数组. #include <bits/stdc++.h> using namespace std; int n, q, L, R, op, P, ...

  4. hihoCoder week19 RMQ问题再临-线段树 单点更新 区间查询

    单点更新 区间查询 #include <bits/stdc++.h> using namespace std; #define m ((l+r)/2) #define ls (rt< ...

  5. [bzoj3339]Rmq Problem||[bzoj3585]mex_线段树

    Rmq Problem bzoj-3339||mex bzoj-3585 题目大意:给定一个长度为n的数列a,多次讯问区间l,r中最小的不属于集合{$A_l,A_{l+1}...A_r$}的非负整数. ...

  6. CF803G-Periodic RMQ Problem【离散化,线段树,ST表】

    正题 题目链接:https://www.luogu.com.cn/problem/CF803G 题目大意 一个长度为\(n\)的序列\(a\)复制\(k\)份连接,要求支持 区间赋值 区间查询最小值 ...

  7. hihoCoder #1070 : RMQ问题再临

    G++ 77ms 0MB 思路:这题用暴力是最快的,甚至比线段树还佳. 按全部都是查询的来算,是O(n*q). #include <bits/stdc++.h> using namespa ...

  8. NYOJ 1012 RMQ with Shifts (线段树)

    题目链接 In the traditional RMQ (Range Minimum Query) problem, we have a static array A. Then for each q ...

  9. nyoj 568——RMQ with Shifts——————【线段树单点更新、区间求最值】

    RMQ with Shifts 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述     In the traditional RMQ (Range Minimum Q ...

随机推荐

  1. 424 Longest Repeating Character Replacement 替换后的最长重复字符

    给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度.注意:字符串长度 和 k 不会超过 104. ...

  2. 189 Rotate Array 旋转数组

    将包含 n 个元素的数组向右旋转 k 步.例如,如果  n = 7 ,  k = 3,给定数组  [1,2,3,4,5,6,7]  ,向右旋转后的结果为 [5,6,7,1,2,3,4].注意:尽可能找 ...

  3. KVM环境下vCPU绑定到物理CPU

    在KVM环境中测试虚拟系统性能时,如果宿主机是有两个CPU socket的硬件,会碰到由于vCPU在不同物理CPU上浮动导致测试RFC2544时出现少量丢包的现象,测试结果非常不稳定.可以将vCPU绑 ...

  4. 浅谈kernel的结构图及生成过程-----(1)

    当今,我们身边如此多的服务器,工作站都运行着linux,因此也有不少的朋友想了解linux内的核心机理.但是由于kernel过于庞大,以致让一些朋友望而却步.(我在大二的时候也有过此经历,当时看到一些 ...

  5. hibernate inverse属性

    修改街道对应的区道信息: 修改后会发现程序执行了两次修改操作: 原因: 区道与街道是一对多的关系: 由于Hibernate是双向维护外键,所以当修改区道中的街道时,会修改一次外键:在修改街道中的区道时 ...

  6. sql server数据类型与其他数据库数据类型对应关系

    SELECT * FROM msdb.dbo.MSdatatype_mappings SELECT * FROM msdb.dbo.sysdatatypemappings

  7. 微信小程序中使用echarts

    一.效果图 二.代码 import * as echarts from '../../component/ec-canvas/echarts'; const app = getApp(); var x ...

  8. Js 之图片懒加载插件

    一.PC端(lazyload) 1.引入js文件 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.m ...

  9. oracle获取排序后的第一条信息

    查询表table1里字段id小于10的所有数据,并且让数据根据id降序排列,然后得到第一条数据 select * from (select * from table1 where id<10 o ...

  10. 用1天快速上手org-mode(windows系统)

    Table of Contents 1. 选择Emacs的理由--Org-mode 1.1. 现状(基于本人现有软件的使用) 1.2. 理念(够用才好) 1.3. 学习过程(少走弯路) 2. 快速安装 ...