线段树区间增加/赋值 求区间和最大值最小值
2015-08-24 23:30
267 查看
/* maxnode为区间长度的三倍 调用: tree.update(1, 1, n); tree.query(1, 1, n, 0); n为区间长度,[y11, y22]为维护或查询区间,v为增加值或修改值 op == 1时区间加上v,op == 2时区间修改为v */ const int maxnode = 100000 * 3; int _sum, _min, _max, op, y11, y22, v; struct IntervalTree { int sumv[maxnode], minv[maxnode], maxv[maxnode], setv[maxnode], addv[maxnode]; // 维护信息 void maintain(int o, int L, int R) { int lc = o*2, rc = o*2+1; if(R > L) { sumv[o] = sumv[lc] + sumv[rc]; minv[o] = min(minv[lc], minv[rc]); maxv[o] = max(maxv[lc], maxv[rc]); } if(setv[o] >= 0) { minv[o] = maxv[o] = setv[o]; sumv[o] = setv[o] * (R-L+1); } if(addv[o]) { minv[o] += addv[o]; maxv[o] += addv[o]; sumv[o] += addv[o] * (R-L+1); } } // 标记传递 void unmark(int o) { int lc = o*2, rc = o*2+1; if(setv[o] >= 0) { setv[lc] = setv[rc] = setv[o]; addv[lc] = addv[rc] = 0; setv[o] = -1; // 清除本结点标记 } if(addv[o]) { addv[lc] += addv[o]; addv[rc] += addv[o]; addv[o] = 0; // 清除本结点标记 } } void update(int o, int L, int R) { int lc = o*2, rc = o*2+1; if(y11 <= L && y22 >= R) { // 标记修改 if(op == 1) addv[o] += v; else { setv[o] = v; addv[o] = 0; } } else { unmark(o); int M = L + (R-L)/2; if(y11 <= M) update(lc, L, M); else maintain(lc, L, M); if(y22 > M) update(rc, M+1, R); else maintain(rc, M+1, R); } maintain(o, L, R); } void query(int o, int L, int R, int add) { if(setv[o] >= 0) { int v = setv[o] + add + addv[o]; _sum += v * (min(R,y22)-max(L,y11)+1); _min = min(_min, v); _max = max(_max, v); } else if(y11 <= L && y22 >= 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(y11 <= M) query(o*2, L, M, add + addv[o]); if(y22 > M) query(o*2+1, M+1, R, add + addv[o]); } } } tree;
相关文章推荐
- 想研究一下数据库,搜了一些数据库书籍
- KVO简单介绍及用法
- php debug
- hdoj 1052 Tian Ji -- The Horse Racing【田忌赛马,贪心】
- Best Time to Buy and Sell Stock III
- [LeetCode#76]Minimum Window Substring
- 在cli/php.ini的文件添加xdebug报错
- CCActionTween,CCAnimationCache源码分析
- 使用mvn archetype:generate生产maven工程,响应很慢
- UVa-679 Dropping Balls
- 启动maven项目报错:java.lang.ClassNotFoundException: ContextLoaderListener解决方法
- 一次重定向引起的异步IO
- 简单演示Exploit SEH原理(未开启SafeSEH模块)
- UVA 11475 Extend to Palindrome(字符hash)
- 华为上机试题5(整数排序并删除一些元素)
- 推荐两个比较全的android在线源代码
- Hashtable
- 神经网络模型算法与生物神经网络的最新联系
- 猜拳游戏--最高效版本
- Linux环境下【mysql】修改mysql5.5默认编码