线段树区间修改 懒惰标记 维护和、最大值、最小值
2015-07-17 21:47
477 查看
6 1 5 10 1577 1 1 7 3649 0 8 10 0 1 4 1 6 8 157 1 3 4 1557
样例输出
4731 14596
#include <cstdio> #include <cstring> #define maxn 100000 + 10 #define Lson L, mid, rt<<1 #define Rson mid+1, R, rt<<1|1 int min(int a, int b) {return a<b ? a : b;} int max(int a, int b) {return a>b ? a : b;} struct Node { int sum, Min, Max, lazy; } T[maxn<<2]; void PushUp(int rt) { T[rt].sum = T[rt<<1].sum + T[rt<<1|1].sum; T[rt].Min = min(T[rt<<1].Min, T[rt<<1|1].Min); T[rt].Max = max(T[rt<<1].Max, T[rt<<1|1].Max); } void PushDown(int L, int R, int rt) { int mid = (L + R) >> 1; int t = T[rt].lazy; T[rt<<1].sum = t * (mid - L + 1); T[rt<<1|1].sum = t * (R - mid); T[rt<<1].Min = T[rt<<1|1].Min = t; T[rt<<1].Max = T[rt<<1|1].Max = t; T[rt<<1].lazy = T[rt<<1|1].lazy = t; T[rt].lazy = 0; } void Build(int L, int R, int rt) { if(L == R) { scanf("%d", &T[rt].sum); T[rt].Min = T[rt].Max = T[rt].sum; return ; } int mid = (L + R) >> 1; Build(Lson); Build(Rson); PushUp(rt); } void Update(int l, int r, int v, int L, int R, int rt) { if(l==L && r==R)//修改区间值 { T[rt].lazy = v; T[rt].sum = v * (R - L + 1); T[rt].Min = T[rt].Max = v; return ; } int mid = (L + R) >> 1; if(T[rt].lazy) PushDown(L, R, rt);//向下更新一级 if(r <= mid) Update(l, r, v, Lson); else if(l > mid) Update(l, r, v, Rson); else { Update(l, mid, v, Lson); Update(mid+1, r, v, Rson); } PushUp(rt); } int Query(int l, int r, int L, int R, int rt) { if(l==L && r== R) { printf("(%d, %d)---Min: %d Max: %d Sum: %d \n", L, R, T[rt].Min, T[rt].Max, T[rt].sum); return T[rt].sum; } int mid = (L + R) >> 1; if(T[rt].lazy) PushDown(L, R, rt); if(r <= mid) return Query(l, r, Lson); else if(l > mid) return Query(l, r, Rson); return Query(l, mid, Lson) + Query(mid + 1, r, Rson); } int main() { int n, q; scanf("%d", &n); Build(1, n, 1); scanf("%d", &q); int a, b, c, d; while(q--) { scanf("%d%d%d", &a, &b, &c); if(a) { scanf("%d", &d); Update(b, c, d, 1, n, 1); } else printf("%d\n", Query(b, c, 1, n, 1)); } return 0; } /* 6 1 2 3 4 5 6 3 0 1 4 1 2 3 0 0 1 4 */
相关文章推荐
- LINUX之文件解压与压缩汇总
- OpenCV 数字验证码识别
- OpenStack Neutron理解
- Opengl二次曲面
- Linux设置tomcat开机启动
- 大型网站的灵魂——性能
- 关于获取config.properties文件内容
- Boost智能指针——scoped_ptr
- User mode Linux
- 大型网站系统架构演化之路
- 编写脚本:访问一网站,每5分钟访问一次,如果访问成功,将访问记录保存到日志,如果访问失败,则发送邮件至指定邮箱
- openvswitch的安装和卸载
- Linux GCC常用命令
- 嵌入式linux之按键驱动,异步通知
- Linux下多线程的重要知识点
- linux重定向,将输出写入txt文件
- ubuntu nginx本地局域网布署sever_name设置
- squid 重定向器
- 每天一个Linux命令-5(tail)
- 每天一个linux命令(4):mkdir命令