线段树单点更新,区间求和、求最值 模板(区间更新的模板待续)
2014-09-22 17:28
369 查看
单点更新分为两种,①把某个值改成另一个值 ②把某个值加上一个值 具体视情况而定,,代码里有说明。
#include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; const int maxn = 2e5; //点的个数 struct Point_Segtree //单点更新,区间求和,求最值 { int seg[maxn<<2],sum[maxn<<2],maxv[maxn<<2],minv[maxn<<2]; void push_down(int pos) { sum[pos] = sum[pos<<1] + sum[pos<<1|1]; minv[pos] = min(minv[pos<<1],minv[pos<<1|1]); maxv[pos] = max(maxv[pos<<1],maxv[pos<<1|1]); } void build(int l,int r,int pos) { if (l == r) { scanf ("%d",seg+pos); maxv[pos] = minv[pos] = sum[pos] = seg[pos]; return; } int mid = (l + r) >> 1; build(l,mid,pos<<1); build(mid+1,r,pos<<1|1); push_down(pos); } void update(int l,int r,int pos,int x,int v) //修改 位置为x 的值, { if (l == r) { seg[pos] = v; // 修改时,直接把某个值改为 v seg[pos] += v; // 修改时,把某个值加上 v 二者选一 sum[pos] = seg[pos]; minv[pos] = seg[pos]; maxv[pos] = seg[pos]; } else { int mid = (l + r) >> 1; if (x <= mid) update(l,mid,pos<<1,x,v); else update(mid+1,r,pos<<1|1,x,v); push_down(pos); } } int _sum,_min,_max; void init() //每次查询都要初始化一下。 { _sum = 0; _max = -100000000; _min = 100000000; } void query(int l,int r,int pos,int ua,int ub) //[ua, ub]为要查询的区间 { if (ua <= l && ub >= r) { _sum += sum[pos]; _min = min(_min,minv[pos]); _max = max(_max,maxv[pos]); return; } int mid = (l + r) >> 1; if (ua <= mid) query(l,mid,pos<<1,ua,ub); if (ub > mid) query(mid+1,r,pos<<1|1,ua,ub); } }; int main(void) { return 0; }
相关文章推荐
- 线段树经典操作模板(单点更新,替换;区间更新,替换;区间求和求最值)
- 线段树 --- (单点更新、区间求和、模板题)
- 线段树经典操作模板(单点更新,替换;区间更新,替换;区间求和求最值)
- 洛谷 2068 线段树模板:单点更新,区间求和
- hdu1166(线段树单点更新&区间求和模板)
- POJ 2029 Get Many Persimmon Trees 二维线段树 单点更新 区间求和
- POJ 1195 Mobile phones 线段树 二维线段树 单点更新 区间求和
- 线段树单点,和区间更新模板
- hdu 1166 敌兵布阵(线段树-单点更新,区间求和)
- 线段树基本操作(单点更新,区间极值,区间求和)
- (模板)线段树 (区间更新,区间求和)
- hdu 1166 敌兵布阵【线段树】单点更新,区间求和
- HDU 1166 敌兵布阵(线段树单点更新区间求和)
- poj3468(线段树区间更新&区间求和模板)
- leetCode_线段树、单点更新、区间求和
- hdu4288 Coder 离线线段树 单点更新 区间求和 离散化?
- hdu1166 敌兵布阵 线段树单点更新+区间求和
- HDU 3874 Necklace(线段树啊 单点更新 区间求和)
- 蓝桥杯算法训练——操作格子(线段树+单点更新+区间求和+求最大值)
- HDU 4819 Mosaic(二维线段树单点更新+区间查询+自己的写法模板)