线段树模板
来源:互联网 发布:vb获取当前日期时间 编辑:程序博客网 时间:2024/05/22 00:49
区间替换模板:
int _sum, _max, _min, v;// 迎来记录查询的值, v是替换值。int sumv[Max_N];int minv[Max_N];int maxv[Max_N];int setv[Max_N];int l ,r;// 查询区间 void maintain(int o, int L, int R) { int lc = o * 2, rc = o * 2 + 1; sumv[o] = minv[o] = maxv[o] = 0; if (R > L) { sumv[o] = sumv[lc] + sumv[rc]; minv[o] = min (minv[lc], maxv[rc]); maxv[o] = max (maxv[lc], maxv[rc]); } if (setv[o] >= 0) { minv[o] = setv[o]; maxv[o] = setv[o]; sumv[o] = setv[o] * (R-L+1); } } void pushdown(int o) { int lc = o * 2, rc = o * 2 + 1; if (setv[o] >= 0) { setv[lc] = setv[rc] = setv[o]; setv[o] = -1; } } void updata(int o, int L, int R) { int lc = o * 2, rc = o * 2 + 1; if (l <= L && r >= R) { setv[o] = v; } else { pushdown(o); int M = L + (R-L) / 2; if (l <= M) updata(lc, L, M); else maintain(lc, L, M); if (r > M) updata(rc, M+1, R); else maintain(rc, M+1, R); } maintain(o, L, R); } void query(int o, int L, int R) { if (setv[o] >= 0) { _sum += setv[o] * (min(R, r) - max(L, l) + 1); _min = min(_min, setv[o]); _max = max(_max, setv[o]); } else if (l <= L && r >= R) { _sum += sumv[o]; _min = min(_min, minv[o]); _max = max(_max, maxv[o]); } else { int M = L + (R - L) / 2; if (l <= M) query(o*2, L, M); if (r > M) query(o*2 + 1, M + 1, R); } }区间修改:
#include <iostream>#include <stdio.h>#include <algorithm>#include <cstring>#include <math.h>#include <queue>#include <set>using namespace std;#define Max_N 1000000*4+1000int _sum, _max, _min, v;int sumv[Max_N];int minv[Max_N];int maxv[Max_N];int addv[Max_N];int l ,r; void maintain(int o, int L, int R) { int lc = o * 2, rc = o * 2 + 1; sumv[o] = minv[o] = maxv[o] = 0; if (R > L) { sumv[o] = sumv[lc] + sumv[rc]; minv[o] = min (minv[lc], maxv[rc]); maxv[o] = max (maxv[lc], maxv[rc]); } minv[o] += addv[o]; maxv[o] += addv[o]; sumv[o] += addv[o] * (R-L+1); } void updata(int o, int L, int R) { int lc = o * 2, rc = o * 2 + 1; if (l <= L && r >= R) { addv[o] += v; } else { int M = L + (R-L) / 2; if (l <= M) updata(lc, L, M); if (r > M) updata(rc, M+1, R); } maintain(o, L, R); } void query(int o, int L, int R, int add) { if (l <= L && r >= R) { _sum += sumv[o] + add * (R - L + 1); _min = min(_min, minv[o] + add); _max = max(_max, maxv[o] + add); } else { int M = L + (R - L) / 2; if (l <= M) query(o*2, L, M, add + addv[o]); if (r > M) query(o*2 + 1, M + 1, R , add + addv[o]); } }
单点更新:
#define Max_N 1000000*4+1000int _sum, _max, _min, v;int sumv[Max_N];int minv[Max_N];int maxv[Max_N];int addv[Max_N];int l ,r , P; void updata(int o, int L, int R) { int lc = o * 2, rc = o * 2 + 1; int M = L + (R-L) / 2; if (R == L) { minv[o] = v; maxv[o] = v; sumv[o] = v; } else { if (P <= M) updata(o*2, L, M); else updata(o*2+1, M+1, R); minv[o] = min(minv[lc], minv[rc]); maxv[o] = max(maxv[lc], minv[rc]); sumv[o] = sumv[lc] + sumv[rc]; } } void query(int o, int L, int R, int add) { if (l <= L && r >= R) { _sum += sumv[o]; _min = min(_min, minv[o]); _max = max(_max, maxv[o]); } else { int M = L + (R - L) / 2; if (l <= M) query(o*2, L, M, add + addv[o]); if (r > M) query(o*2 + 1, M + 1, R , add + addv[o]); } }
0 0
- ACM 线段树模板(模板)
- 线段树模板
- hdu_1166_线段树模板
- 线段树模板
- 线段树模板 poj2777
- 线段树模板
- 线段树模板
- 线段树-模板
- 线段树模板
- 线段树模板
- 线段树模板
- Hdu1166-- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- bzoj2748
- 使用git命令上传本地项目到github
- AD的PCB板设计中PCB板的开槽
- Opacity兼容性
- C语言atoi、atof、atol、atrtod,strtol和strtoul
- 线段树模板
- 使用<a>标签,链接到另一个页面
- 解决 LINK : fatal error LNK1104: 无法打开文件“cv.lib”
- 视图
- 斗地主洗牌发牌案例
- 【数据压缩】Exp04_DPCM量化预测编码
- IOS开发入门:在Storyboard中为UITableView中的static cells设置选中背景色selectedBackgroundColor
- Linux命令基础4-cat命令
- C# 获取url 状态,获取重定向