线段树查询区间最大最小值
来源:互联网 发布:ip网络音柱 编辑:程序博客网 时间:2024/06/06 02:33
#include <iostream>#include <set>#include <map>#include <stack>#include <cmath>#include <queue>#include <cstdio>#include <bitset>#include <string>#include <vector>#include <iomanip>#include <cstring>#include <algorithm>#include <functional>#define PI acos(-1)#define eps 1e-8#define inf 0x3f3f3f3f#define debug(x) cout<<"---"<<x<<"---"<<endltypedef long long ll;using namespace std;#define maxn 200005 //元素总个数#define ls l,m,rt<<1#define rs m+1,r,rt<<1|1int Sum[maxn << 2], Add[maxn << 2]; //Sum求和,Add为懒惰标记int A[maxn], n; //存原数组数据下标[1,n]///建树:Build(1,n,1);//PushUp函数更新节点信息 ,这里是求和void PushUp(int rt){ Sum[rt] = max(Sum[rt << 1], Sum[rt << 1 | 1]);///^^^^^^^^^^^重点变化^^^^^^^^^^^^^^}//Build函数建树void Build(int l, int r, int rt) //l,r表示当前节点区间,rt表示当前节点编号{ if (l == r) //若到达叶节点 { Sum[rt] = A[l]; //储存数组值 return; } int m = (l + r) >> 1; //左右递归 Build(l, m, rt << 1); Build(m + 1, r, rt << 1 | 1); //更新信息 PushUp(rt);}///点修改,假设A[L]+=C: Update(L,C,1,n,1);void Update(int L, int C, int l, int r, int rt) //l,r表示当前节点区间,rt表示当前节点编号{ if (l == r) //到叶节点,修改 { Sum[rt] += C; return; } int m = (l + r) >> 1; //根据条件判断往左子树调用还是往右 if (L <= m) { Update(L, C, l, m, rt << 1); } else { Update(L, C, m + 1, r, rt << 1 | 1); } PushUp(rt);//子节点更新了,所以本节点也需要更新信息}///首先是下推标记的函数:void PushDown(int rt, int ln, int rn){ //ln,rn为左子树,右子树的数字数量。 if (Add[rt]) { //下推标记 Add[rt << 1] += Add[rt]; Add[rt << 1 | 1] += Add[rt]; //修改子节点的Sum使之与对应的Add相对应 Sum[rt << 1] += Add[rt] * ln; Sum[rt << 1 | 1] += Add[rt] * rn; //清除本节点标记 Add[rt] = 0; }}///然后是区间查询的函数:int ANS=Query(L,R,1,n,1); ^^^^^^^^^^查询[L,R]区间的最大/最小值^^^^^^^^^^^^^int Query(int L, int R, int l, int r, int rt) //L,R表示操作区间,l,r表示当前节点区间,rt表示当前节点编号{ if (L <= l && r <= R) { //在区间内,直接返回 return Sum[rt]; } int m = (l + r) >> 1; //下推标记,否则Sum可能不正确 PushDown(rt, m - l + 1, r - m); //累计答案 int ANS = 0; if (L <= m) { ANS = max(ANS, Query(L, R, l, m, rt << 1)); } if (R > m) { ANS = max(ANS, Query(L, R, m + 1, r, rt << 1 | 1)); } return ANS;}
阅读全文
0 0
- 线段树查询区间最大最小值
- poj3264线段树---区间最大最小值查询(RMQ)
- NYOJ 1185 最大最小值 (线段树 & 区间最值查询)
- poj 3264 线段树区间最大最小值
- 线段树求解区间最大最小值
- nyoj 1185 线段树区间最大最小值
- 【POJ 3264】【RMQ 或者线段树】Balanced Lineup 【查询区间内最大最小值的差】
- 线段树+最大最小值查询+敌兵布阵
- poj 2823 线段树 求固定区间的最大最小值
- poj2823------线段树-------求区间最大最小值(RMQ)
- poj3264(线段树求区间最大最小值)
- HDU 4302 线段树单点更新,维护区间最大最小值
- Balanced Lineup(线段树之区间查找最大最小值)
- 线段树求解区间最大最小值(模板)
- NYOJ 1185 最大最小值(线段树—区间求最值)
- 模板:线段树求区间最大/最小值及下标
- 动态区间最小值查询,支持点设置,线段树
- 线段树--数据结构(建树,查询区间和&&最大值&&最小值)
- N3D
- java算法-冒泡排序
- C++拷贝构造函数详解
- 1668: 高桥和低桥
- redis必杀高级:管道技术
- 线段树查询区间最大最小值
- 坚持,毅力(复杂)
- 我是一个线程
- AngualrJS(十四)$watch 2
- ISE14.7下载程序问题
- web.xml 配置-servlet
- hdu 6138 Fleet of the Eternal Throne 基于kmp算法的求解
- 广工oj 1231 && 51nod 1821 加强版 思维+并查集 OR 栈
- python随机产生100000个数计算满足条件的比例