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 ...
随机推荐
- 题解报告:hdu 2094 产生冠军
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2094 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打 ...
- 修改SolrCloud在ZooKeeper中的配置文件操作记录
修改SolrCloud在ZooKeeper中的配置文件操作记录. 命令执行目录: /opt/solr-/server/scripts/cloud-scripts/ 1.下载配置文件 ./zkcli., ...
- Maven环境搭建操作记录
Maven官方网站: http://maven.apache.org/index.html Maven下载地址: http://maven.apache.org/download.cgi Maven历 ...
- 重写java.lang.String IndexOf()方法,实现对字符串以ASCII规则截取
/** * 根据元数据和目标ascii位数截取字符串,失败返回-1 * @param sourceStr 元数据字符串 * @param endIndex 截取到第几位 * @return 结果字符串 ...
- CCF|打酱油|Java
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = ...
- C语言基础-运算符
sizeof()运算符 •sizeof可以用来计算一个变量或者一个常量.一种数据类型所占的内存字节数 •sizeof一共有3种形式 1.sizeof( 变量\常量 ) sizeof(10 ...
- 文档兼容性定义,使ie按指定的版本解析
作为开发人员,特别是作为Web的前端开发人员 ,最悲催的莫过于要不断的,不断的去调试各种浏览器的显示效果,而这其中最让人头痛的莫过于MS下的IE系列浏览器,在IE系列中的调试我们将会发现没有一个是好伺 ...
- JDK1.8中的Stream详解
Stream简介 Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 XML ...
- 数据结构之线性顺序表ArrayList(Java实现)
一.ListMe接口: import java.util.ArrayList; //实现线性表(顺序表和链表)的接口://提供add get isEmpty size 功能public interfa ...
- gprc-java与golang分别实现服务端,客户端,跨语言通信(一.java实现)
1.在pom中引入 <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty< ...