线段树
2015-07-10 21:33
267 查看
线段树模板啦
维护区间和,最大值,最小值
资瓷区间加值,区间赋值
维护区间和,最大值,最小值
资瓷区间加值,区间赋值
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 105; int a[maxn]; int add[maxn << 2], col[maxn << 2]; int minv[maxn << 2], maxv[maxn << 2], sum[maxn << 2]; void maintain(int o, int L, int R) { if(L >= R) return ; int lc = o << 1, rc = o << 1 | 1; sum[o] = sum[lc] + sum[rc]; maxv[o] = max(maxv[lc], maxv[rc]); minv[o] = min(minv[lc], minv[rc]); } void pushdown(int o, int L, int R) { if(L >= R) return ; int M = (L + R) >> 1, lc = o << 1, rc = o << 1 | 1; if(col[o]) { col[lc] = col[rc] = col[o]; add[lc] = add[rc] = 0; sum[lc] = col[o] * (M-L+1); sum[rc] = col[o] * (R-M); maxv[lc] = maxv[rc] = minv[lc] = minv[rc] = col[o]; col[o] = 0; } if(add[o]) { add[lc] += add[o]; add[rc] += add[o]; sum[lc] += add[o] * (M-L+1); sum[rc] += add[o] * (R-M); maxv[lc] += add[o]; maxv[rc] += add[o]; minv[lc] += add[o]; minv[rc] += add[o]; add[o] = 0; } } int op, qv, _sum, _max, _min; void update(int o, int L, int R, int ql, int qr) { if(L == ql && qr == R) { if(op == 1)//add { add[o] += qv; maxv[o] += qv; minv[o] += qv; sum[o] += qv * (R-L+1); } else//set { col[o] = maxv[o] = minv[o] = qv; add[o] = 0; sum[o] = qv * (R-L+1); } } else { pushdown(o, L, R); int M = (L + R) >> 1; if(qr <= M) update(o << 1, L, M, ql, qr); else if(M < ql) update(o << 1 | 1, M+1, R, ql, qr); else { update(o << 1, L, M, ql, M); update(o << 1 | 1, M+1, R, M+1, qr); } maintain(o, L, R); } } void query(int o, int L, int R, int ql, int qr) { if(L == ql && qr == R) { _sum += sum[o]; _max = max(_max, maxv[o]); _min = min(_min, minv[o]); } else { pushdown(o, L, R); int M = (L + R) >> 1; if(qr <= M) query(o << 1, L, M, ql, qr); else if(M < ql) query(o << 1 | 1, M+1, R, ql, qr); else { query(o << 1, L, M, ql, M); query(o << 1 | 1, M+1, R, M+1, qr); } maintain(o, L, R); } } void build(int o, int L, int R) { if(L == R) maxv[o] = minv[o] = sum[o] = a[L]; else { int M = (L + R) >> 1; build(o << 1, L, M); build(o << 1 | 1, M+1, R); maintain(o, L, R); } } int main() { freopen("input.txt","r",stdin); freopen("out2.txt","w",stdout); int n, q; scanf("%d%d", &n, &q); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); build(1, 1, n); while(q--) { int ql, qr; scanf("%d", &op); if(op <= 2) { scanf("%d%d%d", &ql, &qr, &qv); update(1, 1, n, ql, qr); } else { scanf("%d%d", &ql, &qr); _sum = _max = 0; _min = INF; query(1, 1, n, ql, qr); printf("%d %d %d\n", _min, _max, _sum); } } fclose(stdin); fclose(stdout); return 0; }
相关文章推荐
- ubuntu14.04下安装pycharm以及Oracle JDK
- 第2章 字符和字符串处理(2)
- Intent中的四个重要属性——及部分对应值
- hadoop学习(10)----map端的执行过程
- 【poi1999】【cogs239】【积水】【堆】【灌水法】【贪心】
- DOM 操作技术之动态脚本
- Unity学习笔记 之 关于 Unity UI 的 Slider 的代码记录
- Hadoop 之 WritableComparable 接口
- java注解
- CISCO服务器配置RAID步骤
- 为什么C++中空类和空结构体大小为1?
- hdu 1392
- hdu(1016)
- hdu2222
- Atitit.执行cmd 命令行 php
- 通过可视化来了解你的Spark应用程序
- Atitit.执行cmd 命令行 php
- UISegmentedControl控件
- cairo绘图png,pdf,svg
- android动画的透明度渐变、旋转动画、缩放动画、评议动画