区间专题
2015-09-20 21:23
281 查看
一. 区间最大最小值问题
1. RMQ
2. Segment_Tree
1. RMQ
int mx [20]; //最多能保存524288的长度 int RMQ(int l, int r) { int k = 0; while (1<<(k+1) <= r - l + 1) k++; //令k为满足1<<k <= r-l+1的最大整数 return max (mx[l][k], mx[r-(1<<k)+1][k]); //区间最左边1<<k长度的最大值和最右边1<<k长度的最大值,可能有重叠 } int main(void) { for (int i=1; i<=n; ++i) { scanf ("%d", &mx[i][0]); } for (int j=1; (1<<j)<=n; ++j) { for (int i=1; i+(1<<j)-1<=n; ++i) { mx[i][j] = max (mx[i][j-1], mx[i+(1<<(j-1))][j-1]); //从i开始,长度1<<j的区间的最大值 } } printf ("%d\n", RMQ (ql, qr)); }
2. Segment_Tree
struct ST { int mx[N<<2]; void push_up(int rt) { mx[rt] = max (mx[rt<<1], mx[rt<<1|1]); } void build(int l, int r, int rt) { if (l == r) { scanf ("%d", &mx[rt]); return ; } int mid = (l + r) >> 1; build (lson); build (rson); push_up (rt); } int query(int ql, int qr, int l, int r, int rt) { if (ql <= l && r <= qr) { return mx[rt]; } int mid = (l + r) >> 1, ret = 0; if (ql <= mid) ret = max (ret, query (ql, qr, lson)); if (qr > mid) ret = max (ret, query (ql, qr, rson)); return ret; } }st;
相关文章推荐
- leetcode - N-Queens
- 杭电2539点球大战
- 可能导致Java内存泄漏的几项原因
- 自己掌控自己,精而少
- unresolved external symbol错误及其解决方法
- C++ 11 学习3:显示虚函数重载(override)
- C++ 11 学习2:空指针(nullptr) 和 基于范围的for循环(Range-based for loops)
- C++ 11 学习1:类型自动推导 auto和decltype
- 提交Sublime Text 插件到Package Control
- 黑马程序员——集合框架(Collection)
- 百度地图获取地址信息由纬度和经度
- mysql命令大全
- 第二节 基本概念及操作
- 求长度
- 今目标——让我们离成功更近……
- dockerfile 使用方法
- 指针寻找最大小值
- 写lua时需要注意的地方
- 重新认识JavaScript
- ACE网络编程笔记(2):IPC SAP、ACE_SOCKET和TCP/IP通信实例