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 ...
随机推荐
- 配置Oracle监听器
Oracle的监听和网络服务都可以在Net Manager中配置,如下图.也可以在上面的那个Net Configuration Assistant中配置,只是Net Manager比较方便些. Ora ...
- 静态代理,jdbc动态代理和cglib动态代理
静态代理 1.定义抽象主题接口. package com.zhangguo.Spring041.aop02; /** * 接口 * 抽象主题 */ public interface IMath { / ...
- IO流的原理和概念
在程序中如何读写文件?不同的编程语言有不同的方式,而 JAVA 则提出了“流”的概念,通过“流”来读写文件 什么是流: 流(Stream)是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通 ...
- Windows远程桌面连接复制文件失败或非常慢
环境搭建过程中经常会遇到需要将文件从本机传到云服务器或者企业内部服务器上的场景,此时如果文件过大的话要传个半天或者直接告诉你复制失败,让人好生无奈 ~ ~. windows环境下,可以将本地磁盘映 ...
- Discrete Logging
Discrete Logging Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5865 Accepted: 2618 ...
- ES之事件绑定,解除绑定以及事件冒泡、事件捕获
绑定事件的处理方法任何元素都有事件属性,而绑定事件就是将这个事件与一个函数相连接. ①句柄事件dom.onXXX = function () {代码块} 以on开头的事件属于句柄事件兼容性非常好,但是 ...
- php(三)使用PDO链接数据库
1.启动 mysql数据库,打开图形化控制界面 2.新建一个数据库 3.创建一个数据表 4.给数据表添加数据 id是数字类型的 类型选择int长度 11 username 等其他数据 会是字符串形 ...
- darknet+opencv在windows上的编译
darknet 源码网站:https://github.com/pjreddie/darknet 技术支持官网:https://pjreddie.com/darknet/ darknet采用C++编写 ...
- eval()将json 字符串转换为数组
json ={ GW:[{id:"655",mc:"董事"},{id:"656",mc:"书记"},{id:" ...
- Laravel Excel模板导出-带图片
Laravel Excel版本 3.1 1.数据准备 建个2个表,加点数据,控制器中查数据,给模板使用. 表1-order:id, order_no, img_path, note 表2-order_ ...