hiho1078 线段树的区间修改
2015-06-10 21:44
405 查看
题目链接:
hihocoder1078
题解思路:
模板题 需要用到懒惰标记
代码:
hihocoder1078
题解思路:
模板题 需要用到懒惰标记
代码:
#include<iostream> #include<cstdio> #include<cstring> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define maxn 100050 using namespace std; int sum[maxn<<2]; int tag[maxn<<2]={0}; void pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void pushdown(int rt,int d) { if(tag[rt]) { tag[rt<<1]=tag[rt<<1|1]=tag[rt]; sum[rt<<1]=(d-(d>>1))*tag[rt]; sum[rt<<1|1]=(d>>1)*tag[rt]; tag[rt]=0; } } void build(int l,int r,int rt) { if(l==r) { scanf("%d",&sum[rt]); return; } int m=(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) { sum[rt]=(r-l+1)*v; tag[rt]=v; return; } pushdown(rt,r-l+1); int m=(l+r)>>1; if(m>=L) update(L,R,v,lson); if(m<R) update(L,R,v,rson); pushup(rt); } int query(int L,int R,int l,int r,int rt) { if(L<=l&&R>=r) return sum[rt]; pushdown(rt,r-l+1); int m=(l+r)>>1,s=0; if(m>=L) s=query(L,R,lson); if(m<R) s+=query(L,R,rson); return s; } int main() { int n,q,op,l,r,v; scanf("%d",&n); build(1,n,1); scanf("%d",&q); while(q--) { scanf("%d%d%d",&op,&l,&r); if(op==0) printf("%d\n",query(l,r,1,n,1)); else { scanf("%d",&v); update(l,r,v,1,n,1); } } return 0; }
相关文章推荐
- 【android初学日志】gravity 和 layout_gravity区别<三>
- C语言基础:分支语句和常见运算符
- C语言基础:分支语句和常见运算符 分类: iOS学习 c语言基础 2015-06-10 21:44 13人阅读 评论(0) 收藏
- 黑马程序员——java基础——递归
- android 数据库相关操作
- webp格式研究
- c语言基础:数据类型
- Spring集成ORM框架之Hibernate的使用
- 一个KVM的安装
- c语言基础:数据类型 分类: iOS学习 c语言基础 2015-06-10 21:43 9人阅读 评论(0) 收藏
- C语言基础-第六章
- DataGrid 得到DataGridRow 和DataGridColumn
- AtomicInteger简介
- ligntOj 1038(期望)
- 利用GDI+基于WIN32实现桌面雪花效果(二)
- Python基础:26模块
- C语言基础:二维数组
- C语言基础:二维数组 分类: iOS学习 c语言基础 2015-06-10 21:42 16人阅读 评论(0) 收藏
- C语言基础-第一章
- C语言基础-第五章