hihoCoder#1077 RMQ问题再临-线段树
2015-04-01 20:19
393 查看
原题地址
终于做到线段树的题了,因为建树、更新、查询都是递归操作,所以其实挺好写的。
用数组存的树,记得MAX_NODE开成两倍叶节点数大小,否则RE啊。。不要问我是怎么知道的。
代码:
终于做到线段树的题了,因为建树、更新、查询都是递归操作,所以其实挺好写的。
用数组存的树,记得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 = 1; left[0] = right[0] = root = 0; value[0] = INT_MAX; } int insert(int v) { value[size] = v; size++; return size - 1; } int _build(int l, int r) { if (l > r) return 0; if (l == r) { left[l] = right[l] = 0; begin[l] = end[l] = l; return l; } int lc = _build(l, (l + r) / 2); int rc = _build((l + r) / 2 + 1, r); int me = insert(-1); 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(1, size - 1); } int _query(int n, int l, int r) { if (begin == l && end == r) return value ; int medium = (begin + end ) / 2; if (r <= medium) return _query(left , l, r); if (l > medium) return _query(right , l, r); return min(_query(left , l, medium), _query(right , medium + 1, r)); } int query(int l, int r) { return _query(root, l, r); } void _update(int n, int p, int v) { if (begin == p && end == p) { value[p] = v; return; } int medium = (begin + end ) / 2; if (p <= medium) _update(left , p, v); if (p > medium) _update(right , p, v); value = min(value[left ], value[right ]); } void update(int p, int v) { _update(root, p, v); } } st; int main() { st.init(); scanf("%d", &N); for (int i = 0; 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 0; }
相关文章推荐
- #1077 : RMQ问题再临-线段树
- #1077 : RMQ问题再临-线段树(线段树)
- Hihocoder #1077 : RMQ问题再临-线段树(线段树:结构体建树+更新叶子往上+查询+巧妙使用father[]+线段树数组要开大4倍 *【模板】)
- hihoCoder 1077 RMQ问题再临-线段树
- RMQ问题再临 (线段树)
- [HihoCoder]#1077 : RMQ问题再临-线段树
- hihocoder #1077 RMQ问题再临-线段树
- 线段树水题 #1077 : RMQ问题再临-线段树
- hihoCoder #1070 : RMQ问题再临(线段树)
- hihoCoder #1077-> RMQ问题再临-线段树
- hiho刷题日记——第十九天RMQ问题再临-线段树
- hihoCoder #1077 RMQ问题再临-线段树
- hiho #1077 : RMQ问题再临-线段树
- HiHo #1070 && 1077 : RMQ问题再临 【RMQ-线段树】
- hiho一下 第十九周 RMQ问题再临-线段树
- HIHO #1077 : RMQ问题再临-线段树
- 1077 RMQ问题再临-线段树
- hihoCode r#1077 : RMQ问题再临-线段树
- hdu 1754:I Hate It(线段树,入门题,RMQ问题)
- hiho一下 第十八周 RMQ问题再临