树状数组求区间最值
来源:互联网 发布:手机驱鼠软件 编辑:程序博客网 时间:2024/06/05 19:20
#define lowbit(i) (-i & i) // 二进制数字最低位'1'和其后'0'组成的数字template<typename T>class BinaryIndexedTree {public:BinaryIndexedTree(const vector<T>& arr) :LEN(arr.size()) {ori = arr;ori.insert(ori.begin(), INT_MAX);BuildBIT(arr);}/** 构建树状数组,index 从1开始, 输入数组index 从 0 开始,利用update 操作完成*/void BuildBIT(const vector<T> &arr) {idx.resize(LEN + 1, INT_MAX);for (int i = 1; i <= LEN; ++i) {idx[i] = arr[i - 1];for (int j = i - 1; j > i - lowbit(i); j -= lowbit(j)) {idx[i] = min(idx[i], idx[j]);}/* 另外一种写法 * for(int j=1;j<lowbit(i); j<<=1){ * idx[i]=min(idx[i],idx[i-j]); *} */}}int Query(int start, int end) {int ret = ori[end]; start++; // 索引重映射end++; while (end >= start) {// idx[end]覆盖的左边界小于等于start点if (start <= end - lowbit(end) + 1) {ret = min(ret, idx[end]);end -= lowbit(end); // 兄弟结点}else { // idx[end]覆盖的左边界大于start点ret = min(ret, ori[end--]); }}return ret;}void modify(int id, const int val) {ori[++id] = val;// ++id, 索引重映射for (int index = id; index <= LEN; index += lowbit(index)) {//向上遍历,找父亲结点idx[index] = ori[index]; for (int j = index - 1; j > index - lowbit(index); j -= lowbit(j)) {//遍历孩子结点idx[index] = min(idx[index], idx[j]);}}}private:vector<T> idx;vector<T> ori; //original arrayconst int LEN;};
0 0
- 树状数组求区间最值(转载)
- 树状数组求区间最值
- 用树状数组求区间最值
- 树状数组求区间最值
- hdu1754 求区间最值 线段树 树状数组
- 树状数组求区间最值(RMQ)
- poj3264 树状数组维护区间最值
- 【hdu1754】树状数组 区间最值
- HDU 1754 I Hate It 树状数组求区间最值
- HDU 1754 I Hate It(树状数组求区间最值)
- 爱爬山的小Z(树状数组求区间最值)
- 树状数组求带单点修改区间最值问题 HDU 1754:I Hate It
- 树状数组求区间最大值
- 树状数组求区间和
- 树状数组求区间极值
- 树状数组求区间极值
- 树状数组求区间和
- 树状数组求区间最大值
- Mac上安装nginx
- Android基础之 EditText运用
- structs2+spring+mybatis 配置log4j
- java的jvm
- popupWindow使用返回为null
- 树状数组求区间最值
- 机器学习
- 存储过程简介
- ElasticSearch学习教程(二) Head插件安装及使用
- LwIP代码目录结构
- opencv 简单绘图学习笔记
- 浅谈MVC之模型(M)->视图(V)->控制器(C)的加载
- 快速排序算法java实现
- 数据结构-单链表的操作